JPA Repository如何通过关联实体ID直接查询,无需转换为实体对象
错误根因
你编写的JPQL中e.customEntity指向的是完整的CustomEntity实体类型,和你传入的Long类型ID列表类型不匹配,因此触发类型校验异常。
解决方案
有两种实现方式,生成的SQL都和你预期的原生查询完全一致,不需要关联查询custom_entities表,也不需要额外将ID转为实体对象:
方案1:修改现有@Query语句
调整JPQL的查询条件,直接访问关联实体的主键字段id即可:
@Repository interface MyEntityRepository extends JpaRepository<MyEntity, Long> { @Query(""" select e from MyEntity e where e.deleted = false and e.customEntity.id in :ids """) // 注意修正返回值类型,原代码返回TestCollectionQuery和实体类型不匹配 List<MyEntity> findByCustomEntityIds(@Param("ids") List<Long> ids) }
方案2:使用Spring Data JPA方法名派生查询
不需要手动写JPQL,按照Spring Data的命名规则定义方法即可自动生成正确的查询逻辑:
@Repository interface MyEntityRepository extends JpaRepository<MyEntity, Long> { List<MyEntity> findByDeletedFalseAndCustomEntityIdIn(List<Long> customEntityIds); }
设计合理性说明
你的现有设计没有根本性缺陷,只是JPQL的语法使用不符合关联对象的属性访问规则,以上两种方案都可以在不增加额外数据库请求的前提下实现需求。
内容的提问来源于stack exchange,提问作者Carsten
相关产品推荐
相关产品推荐

