You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JPA原生查询中传递Java对象并访问其属性?

在JPA原生查询中通过Java对象传递参数的解决方案

你之前的写法无法生效,是因为JPA原生查询不支持直接用:obj.publicKey这种对象属性访问语法,但可以通过Spring Data JPA的SpEL表达式实现需求,具体方案如下:

1. 核心修正:使用SpEL表达式访问对象属性

Spring Data JPA允许在原生查询中通过#{#参数名.属性名}的SpEL语法,直接提取传入Java对象的属性值。结合你的实体类,修正后的Repository代码如下:

public interface SigningKeysRepository extends JpaRepository<SigningKeysEnt, Long> {
 
    @Query(value = "SELECT * FROM signing_keys WHERE public_key = #{#obj.publicKey}", nativeQuery = true)
    List<SigningKeysEnt> findByPublicKeyFromObject(@Param("obj") SigningKeysEnt obj);
}

关键说明:

  • 修正了原代码中的错误:Repository接口名改为SigningKeysRepository(匹配实体类),表名改为signing_keys(对应实体的@Table注解配置),字段名改为public_key(对应实体publicKey属性的数据库列名)
  • 用#{#obj.publicKey}替代:obj.publicKey,Spring Data会自动解析该表达式,获取传入对象的publicKey属性值
  • 你的实体类已添加@Getter注解,确保Spring能正常读取属性值,这是功能生效的前提

2. 多属性场景的扩展用法

如果需要同时使用对象的多个属性作为查询条件,直接在SQL中添加对应的SpEL表达式即可:

@Query(value = "SELECT * FROM signing_keys WHERE protocol_version = #{#obj.protocolVersion} AND signature_algorithm = #{#obj.signatureAlgorithm}", nativeQuery = true)
List<SigningKeysEnt> findByProtocolAndAlgorithm(@Param("obj") SigningKeysEnt obj);

3. 其他注意事项

  • 确保实体类属性名与数据库列名对应正确,或通过@Column注解明确映射关系(你的实体已正确配置)
  • 该特性要求Spring Data JPA版本在1.10及以上,若使用旧版本需先升级框架

内容的提问来源于stack exchange,提问作者Peter Penzov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 20:15:06