Spring Boot 3中JPQL查询报错:关联所有者未在选择列表中
解决方案
问题原因
查询中使用了join fetch关联pon.person,但JPQL的fetch关键字作用是将关联实体加载到Hibernate持久化上下文(Session)中,要求被抓取关联的所有者(此处为PersonOtherName实体)或被抓取的实体本身必须出现在select列表内。而你的查询是直接构造DTO,未将完整实体放入select,因此触发语义异常。
修复方式
将join fetch改为普通的join即可,因为你仅需访问Person实体的字段来构造DTO,不需要把整个Person实体加载到会话中。修改后的代码如下:
@Query(""" select distinct new com.acme.person.dto.OtherPersonDuplicate(p.idEditeur, p.code, pon.otherName, p.city) from PersonOtherName pon join pon.person p WHERE lower(pon.otherName) like lower(:name) """) public List<OtherPersonDuplicate> findDuplicate(String name);
补充说明
distinct需保留,因为普通join可能因关联关系产生重复的DTO结果,distinct可实现去重。- 若后续需要将
Person实体加载到会话中(比如要修改该实体),则需调整select列表,把pon或p加入其中,但这与构造DTO的需求冲突,因此这类场景不适合使用fetch。
内容的提问来源于stack exchange,提问作者robert trudel
相关产品推荐
相关产品推荐

