HQL查询中不需要的隐式内连接

问题描述 投票:1回答:1

我正在尝试编写QueryDSL表达式来选择列值。这是与'from'表格的一些联接:

a.b.c.get(0).field

其中b可能是null对象,但如果没有,那么它将在c集合中最多有1条记录。我想要的是类似的东西

new CaseBuilder()
 .when(a.b.isNotNull().and(a.b.c.isNotEmpty()))
 .then(a.b.c.get(0).field.stringValue())
 .otherwise(Expressions.stringTemplate("''"))

这隐含地在SQL中使用bc表生成内部联接,这不是我想要的,因为当b实际上是null时,它不返回任何结果。无论如何,添加显式左外连接并不会停止隐式连接。我很确定我没有想到这个正确的方法,请帮我解开:-)

sql hibernate hql querydsl
1个回答
1
投票

当我添加support for implicit joins to jOOQ时,我已经研究了这个主题,并在Hibernate中偶然发现了这个“限制”/设计。我最近向Hibernate-dev邮件列表报告了这个问题,因为我清楚地认为这是一个错误:http://lists.jboss.org/pipermail/hibernate-dev/2018-February/017299.html

我不明白为什么任何投影表达式应该“无意中”在FROM子句上产生一个过滤器。这似乎与用关系代数思考时可能构建的直觉完全相反。

您可以阅读该电子邮件的回复,特别是Steve Ebersole的这个理由:

我说我不能再看HQL / JPQL了,如果它依赖于映射的关联,那么告诉它将使用哪种SQL连接。这个方法在前面的线程中提到过。但是你澄清说你的意思是隐式连接应该总是被解释为外连接。

你可以插入自己的查询处理并解释你想要的隐式连接。这当前不是最微不足道的任务。

我不认为这会很快在Hibernate中修复。因此,这里的解决方法是显式地构建所有外连接,并且在您期望它们生成外连接时不使用任何隐式连接。

© www.soinside.com 2019 - 2024. All rights reserved.