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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:05:19