java - Hibernate HQL LEFT JOIN 的执行与等效 SQL 不同

标签 java sql hibernate

无法弄清楚为什么这两个语句返回不同数量的结果。它们应该是相同的。 SQL 版本(正确)返回 2 个结果,HQL 版本(错误)返回 3 个结果。

SQL 的输出返回 tb2.user 的 3 个结果,值为 1、null 和 null。 where 子句意味着过滤到 2 个结果,删除 tb2.user 值为 1 的结果。但是,HQL 版本返回 3 个结果。我希望 HQL 返回 2 个结果。

我的SQL

SELECT * FROM table1 as tb1 LEFT JOIN table2 as tb2 ON tb1.user = tb2.blocked WHERE tb2.user <> 1 OR tb2.user is null;

我的 HQL

SELECT r FROM table1 tb1 LEFT JOIN table2 tb2 ON tb1.user.id = tb2.user.id WHERE tb2.user.id <> :userId OR tb2.user.id is null GROUP BY tb1

非常感谢对此的任何帮助!

最佳答案

您不应该在where条件下使用左连接表的列..这可以作为内部连接
您应该将这些条件移至相关的 ON 子句中

在第二个查询(My HQL)中,您的分组依据不正确,没有聚合功能(因此查询不等效) (当您需要不同的结果时..使用 Distinct 子句)

  SELECT r 
  FROM table1 tb1 
  LEFT JOIN table2 tb2 ON tb1.user.id = tb2.user.id 
    AND  ( tb2.user.id <> :userId OR tb2.user.id is null ) 

关于java - Hibernate HQL LEFT JOIN 的执行与等效 SQL 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57452809/

相关文章:

java - JFreeChart 使 XYSeriescollection 可迭代

spring - 在 Jetty 中部署 spring/hibernate 应用程序时出现 java.lang.ClassNotFoundException : org. hibernate.cache.access.AccessType

java - 为什么这个正则表达式在 PHP 中可以正常工作,但在 Java 中却不能?

java - Java/Grails 应用程序的 SaaS 基础架构

sql - 存储过程sql中的日期转换

sql - 如何为给定的一组行创建某种迭代器(或人工 ID)?

mysql - 在子查询返回多行的情况下对值求和。 (我的用例是 2 行)

mysql - 如何优化 Web 应用程序中从数据库中提取请求?

java - 当查询结果不是类时,JPA 查询方法的返回类型是什么?

java - ORACLE JDBC 批处理执行不返回受影响行的实际计数