如何在JPA派生查询中使用嵌入对象中的值
解决JPA派生查询嵌入对象属性的问题
方法1:遵循JPA属性路径规则修改派生方法名
JPA派生查询需要通过嵌入对象的字段名 + 内部属性名的路径来识别,你的ParentObject中嵌入对象的字段是cO,所以正确的方法名要对应属性路径cO.childObjectId,修改Repository方法如下:
public interface ParentObjectRepository extends JpaRepository<ParentObject, Long> { List<ParentObject> findByCOChildObjectId(List<Long> ids); }
注:JPA会自动将方法名的驼峰部分转换为属性路径,
CO对应字段cO,ChildObjectId对应ChildObject中的childObjectId。
方法2:使用@Query注解编写JPQL查询(更灵活)
如果觉得方法名太长或不够直观,可以直接用JPQL指定查询逻辑,绕过派生查询的自动解析:
public interface ParentObjectRepository extends JpaRepository<ParentObject, Long> { @Query("SELECT p FROM ParentObject p WHERE p.cO.childObjectId IN :ids") List<ParentObject> findByChildObjectId(@Param("ids") List<Long> ids); }
这种方式不需要依赖方法名的命名规则,直接明确查询条件,不易出错。
方法3:规范实体字段命名(推荐长期方案)
把嵌入对象的字段名从cO改为更清晰的childObject,提升代码可读性,派生方法名也更直观:
修改ParentObject:
public abstract class ParentObject { @Id private Long id; @Embedded private ChildObject childObject; public Long getChildObjectId() { return childObject.getChildObjectId(); } }
修改Repository方法:
public interface ParentObjectRepository extends JpaRepository<ParentObject, Long> { List<ParentObject> findByChildObjectChildObjectId(List<Long> ids); }
原方法报错原因
你定义的getChildObjectId()只是普通getter方法,JPA派生查询默认只识别实体类中的持久化属性(即映射到数据库列的字段),不会自动将自定义getter作为查询属性,必须通过嵌入对象的属性路径访问内部字段。
内容的提问来源于stack exchange,提问作者Phil
相关产品推荐
相关产品推荐

