JPQL返回自定义DTO时关联嵌套实体为空无查询结果问题求解
问题根因
JPQL中对关联实体的隐式访问(直接通过父实体.关联实体.字段的写法)默认采用**内连接(INNER JOIN)**策略,当ItemEntity关联的nestedEntity为null时,整行数据会被内连接逻辑过滤,因此哪怕你对字段做了空值处理,也无法拿到对应结果。而默认命名查询返回实体时,JPA会默认采用左连接加载关联属性,所以可以正常返回父实体数据。
可行解决方案
你需要**显式声明左外连接(LEFT JOIN)**关联的嵌套实体,再配合COALESCE处理空值即可,修正后的查询写法如下:
@Query("SELECT new my.package.MyDTO(" + "itemEntity.field1, " + "COALESCE(CONCAT(nested.field1, ' ', nested.field2), '-'), " + "COALESCE(nested.field2, '-') " + ") FROM ItemEntity itemEntity " + "LEFT JOIN itemEntity.nestedEntity nested " + "WHERE itemEntity.country = :country") MyDTO findByCountry(@Param("country") CountryEnum country);
修改点说明
- 显式声明
LEFT JOIN itemEntity.nestedEntity nested,给关联的嵌套实体指定别名nested,左连接会保留nestedEntity为null的父实体数据,不会被过滤 - 所有嵌套实体字段都通过左连接的别名
nested访问,配合COALESCE函数就可以正确将null值替换为默认值 - 修正了你之前COALESCE函数的语法错误:你之前将默认值
'-'写到了COALESCE的括号外,需要放到函数参数列表中才能生效 - 注意检查DTO类的全限定名拼写,你的代码中DTO类名为
MyDTO,最初查询里写的MyDto大小写不匹配会触发类找不到异常,同时你原查询中用到的nestedEntity.field3在你给出的NestedEntity定义中不存在,需要替换为实际存在的字段名
内容的提问来源于stack exchange,提问作者John Student
相关产品推荐
相关产品推荐

