2013-02-07 28 views
4

左外連接應該從左表中獲取所有數據,無論B表中是否存在匹配的記錄,但是如果左表中的right_id列爲null,記錄不能得到。HQL左對外加入null列,一對一

我解釋更

在數據模型:Order.java,這是我的左表中,有一個一對一的關係

@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有錯誤嗎?它是通過對hibernate運行時自動創建的SQL命令建模而創建的。

我發現這一點,

HQL支持兩種關聯join的形式:隱性和顯性。

上一節中顯示的查詢都使用顯式表格 ,即在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對象中的列和關係。我能做些什麼來解決這個問題?

回答

6

添加另一個明確的左連接的查詢:

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 
+1

我應該得到它! 'shippingDetail.shippingCompany.id as shippingCompanyId'第一個點是'LEFT OUTER JOIN o.shippingDetail AS shippingDetail',第二個是根據Hibernate文檔產生INNER JOIN。謝謝... – efirat