簡體   English   中英

HQL Left Outer以一對一的關系連接空列

[英]HQL Left Outer Join for null column in one-to-one relation

左外連接應該從左表中獲取所有數據,無論是否存在來自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支持兩種形式的關聯連接:隱式和顯式。

上一節中顯示的查詢都使用顯式形式,即在from子句中顯式使用join關鍵字的位置。 這是推薦的表格。

隱式表單不使用join關鍵字。 相反,使用點符號“解除引用”關聯。 隱式連接可以出現在任何HQL子句中。 隱式連接導致生成的SQL語句中的內部聯接。

我刪除了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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM