java - 一对一关系中空列的 HQL 左外连接

标签 java hibernate hql left-join

左外连接应该从左表中获取所有数据,无论B表是否有匹配的记录,但是如果左表right_id列为空,则无法获取记录。

我在解释更多

Data model: Order.java中,是我的LEFT表,一对一的关系

@OneToOne(targetEntity = OrderShippingDetail.class, optional=true, cascade = {CascadeType.ALL})
@JoinColumn(name = "SHIPPING_DETAIL_ID", referencedColumnName = "ID")
private OrderShippingDetail shippingDetail;

HQL 是:

    hql = "SELECT " +
            "o.id as id, " +
            "o.createTime as createTime, " +
            "o.customerEmailAddress as customerEmailAddress, " +
            "o.customerPhoneNumber as customerPhoneNumber, " +
            "o.customerNote as customerNote, " +
            "o.invoicePrintedFlag as invoicePrintedFlag, " +
            "shippingAddress.address.personName as shippingPersonName, " +
            "shippingDetail.shippingCompany.id as shippingCompanyId, "+
            "shippingDetail.shippingCompany.name as shippingCompanyName, "+
            "shippingDetail.receiptNumber as shippingReceiptNumber, "+
            "shippingDetail.trackingNumber as shippingTrackingNumber, "+
            "shippingDetail.price as shippingPrice, "+
            "o.invoiceNumber as invoiceNumber " + 
        "FROM Order AS o " +
        "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
        "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

但是只有“SHIPPING_DETAIL_ID”不为空的记录。 HQL 有错误吗?它是通过建模 SQL 命令创建的,该命令在 hibernate 运行时自动创建。

我找到了,

HQL supports two forms of association joining: implicit and explicit.

The queries shown in the previous section all use the explicit form, that is, where the join keyword is explicitly used in the from clause. This is the recommended form.

The implicit form does not use the join keyword. Instead, the associations are "dereferenced" using dot-notation. implicit joins can appear in any of the HQL clauses. implicit join result in inner joins in the resulting SQL statement.

然后我删除了 SELECT 部分中的点符号,所以我的新 HQL:

hql = "SELECT " +
                "o.id as id, " +
                "o.createTime as createTime, " +
                "o.customerEmailAddress as customerEmailAddress, " +
                "o.customerPhoneNumber as customerPhoneNumber, " +
                "o.customerNote as customerNote, " +
                "o.invoicePrintedFlag as invoicePrintedFlag, " +
                "shippingDetail, " +
                "o.invoiceNumber as invoiceNumber " + 
            "FROM Order AS o " +
            "LEFT OUTER JOIN o.shippingAddress AS shippingAddress " +
            "LEFT OUTER JOIN o.shippingDetail AS shippingDetail ";

因此,它有效,它返回 Order 表中的所有记录,但是,我不想选择 ShippingDetail 对象中的所有列和关系。我该怎么做才能解决这个问题?

最佳答案

向查询添加另一个显式左连接:

SELECT o.id as id, 
...,
shippingCompany.id as shippingCompanyId, 
shippingCompany.name as shippingCompanyName, 
...
FROM Order AS o
LEFT OUTER JOIN o.shippingAddress AS shippingAddress 
LEFT OUTER JOIN o.shippingDetail AS shippingDetail
LEFT OUTER JOIN shippingDetail.shippingCompany AS shippingCompany

关于java - 一对一关系中空列的 HQL 左外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14760610/

相关文章:

mysql - 在 hibernate 条件中使用 mysql "order by case"

java - 添加 Null 检查会引发一系列编译错误

java - 如何打开终端窗口并在 php 中执行命令?

java - 映射通过引用带有注释的未知目标实体属性

java - 使用 spring jpa 逐行获取数据库

hadoop - 如何将文本表中的数据(使用 MultiDelimitSerDe)插入到 Avro 表中?

java - HQL 不返回结果,但生成的 SQL 在 SQL Developer 上完美运行

java - Spring @Value 没有解析为属性文件中的值

java在命令行上显示变化的进度

hibernate - HQL按属性顺序指定顺序?