我正在尝试编写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中使用b
和c
表生成内部联接,这不是我想要的,因为当b
实际上是null
时,它不返回任何结果。无论如何,添加显式左外连接并不会停止隐式连接。我很确定我没有想到这个正确的方法,请帮我解开:-)
当我添加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中修复。因此,这里的解决方法是显式地构建所有外连接,并且在您期望它们生成外连接时不使用任何隐式连接。