【问题标题】:Unwanted implicit inner join in HQL queryHQL 查询中不需要的隐式内部联接
【发布时间】:2019-03-16 02:20:32
【问题描述】:

我正在尝试编写用于选择列值的 QueryDSL 表达式。距离“来自”表有几个连接:

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

其中b 可能是空对象,但如果不是,那么它在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】:

    当我添加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 中得到解决。因此,这里的解决方法是显式构建所有外连接,而不是在您希望它们生成外连接时使用任何隐式连接。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-10
      • 1970-01-01
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多