2009-10-06 50 views
12

我有一個休眠映射像這樣在ProductDfn類休眠默認接合爲空的許多對一

@ManyToOne(fetch = FetchType.LAZY, optional = true) 
@JoinColumn(name = "productTypeFk", nullable = true) 
public ProductType getProductType() 
{ 
    return productType; 
} 

注意,關係被定義爲可選的(和列可以爲空)。

在做HQL這樣的事情

select p.name as col1, p.productType.name as col2 from ProductDfn p 

內連接用於連接到ProductDfn作爲ProductType休眠生成SQL明確從隱式連接在SELECT子句中加入。

但是,當productType爲null時(在數據庫中)執行上述操作時,由於內部聯接而不返回任何行。對於這種關係,我想讓hibernate默認做一個外部聯接(因爲關係是可選的),所以我會爲col2返回一個「null」,而不是根本沒有行。

有誰知道這是可能的嗎?

謝謝。

回答

9

使用內部連接是因爲您在select子句中明確列出了p.productType.name。由於您的抓取設置爲LAZY,因此您只需選擇ProductDfn就不會發生這種情況。

如果你只需要找回這兩個屬性,你必須明確指定外連接在查詢:

select p.name as col1, ptype.name as col2 
    from ProductDfn p 
    left join fetch p.productType ptype 
+1

謝謝,我一直在尋找一種方法來有休眠更改其默認的聯接類型隱式連接在select子句中完成。原因是我們有一個應用程序,其中許多查詢是由於檢索表格數據而自動/半生成的。 所以我們可以做base object = ProductDfn,col1是name,col2是productType.name等等。通常情況下,這可以正常工作,但對於可爲空的外鍵,它不會以我想要的方式工作。 – 2009-10-06 20:58:49

+2

雖然沒有「默認連接類型」,但隱式連接會將_always_設爲內部。如果正在生成查詢,請考慮使用Criteria而不是HQL--它基本上強制使用明確描述關聯(通過別名/嵌套條件),並且始終可以將其指定爲外連接。 – ChssPly76 2009-10-06 21:23:57