【问题标题】:Left Join in HQL - Hibernate queryHQL 中的左连接 - 休眠查询
【发布时间】:2015-12-08 23:19:09
【问题描述】:

我有 2 个实体,每个都存储在 mysql 表中。 1. productA : {productId(pk) , desc , date} 2. productB : {productId(pk) , quantity,type,date}

我想运行这个 SQL 查询:

     select a.* 
     from productA a left join productB b using(productId)   
     where b.productId is null

(返回a中所有b中不存在的产品)

是否可以在 Hibernate 中编写此查询?

谢谢!!

【问题讨论】:

    标签: java sql spring hibernate hql


    【解决方案1】:

    是否可以在 Hibernate 中编写此查询?

    是的,当然。来自JPA specification 2.1 (4.4.5.2 Left Outer Joins)

    LEFT JOIN 和 LEFT OUTER JOIN 是同义词。他们使 检索连接中匹配值的一组实体 条件可能不存在。左外连接的语法是

    LEFT [OUTER] JOIN join_association_path_expression [AS] identification_variable
    [join_condition]
    

    没有指定连接条件的外连接具有隐式连接 条件对应的外键关系 join_association_path_expression。它通常会映射到 外键关系上具有 ON 条件的 SQL 外连接为 在以下查询中:Java Persistence 查询语言

    SELECT s.name, COUNT(p)
    FROM Suppliers s LEFT JOIN s.products p
    GROUP BY s.name
    

    SQL

    SELECT s.name, COUNT(p.id)
    FROM Suppliers s LEFT JOIN Products p
    ON s.id = p.supplierId
    GROUP By s.name
    

    带有显式 ON 条件的外连接会导致额外的 指定要添加到生成的 SQL 的连接条件:Java 持久性查询语言:

    SELECT s.name, COUNT(p)
    FROM Suppliers s LEFT JOIN s.products p
    ON p.status = 'inStock'
    GROUP BY s.name
    

    SQL

    SELECT s.name, COUNT(p.id)
    FROM Suppliers s LEFT JOIN Products p
    ON s.id = p.supplierId AND p.status = 'inStock'
    GROUP BY s.name
    

    请注意,此查询的结果将与 以下查询:

    SELECT s.name, COUNT(p)
    FROM Suppliers s LEFT JOIN s.products p
    WHERE p.status = 'inStock'
    GROUP BY s.name
    

    后面的查询结果会排除没有供应商的供应商 库存产品,而前一个查询将包括它们。

    LEFT JOIN 的一个重要用例是启用 相关数据项作为查询的副作用。这是完成的 通过将 LEFT JOIN 指定为 FETCH JOIN,如下所述。

    【讨论】:

      猜你喜欢
      • 2015-04-17
      • 2013-01-19
      • 2016-05-02
      • 2014-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多