2014-08-27 14 views
0

我偶然發現了Hibernate的一個問題。我有2個實體 - 假設A和B像這樣(實體/表註釋中省略):通過嵌套實體字段進行冬眠命令,可能爲空值

class A { 
    @ManyToOne 
    @JoinColumn(name = "b_id") 
    private B b; 
} 

class B { 
    @Column(name = "name") 
    private String name; 
} 

現在,我想查詢所有一個實體和場的命令他們的實體,像這樣:

SELECT q FROM A AS q ORDER BY q.b.name asc nulls last 

的問題是,有行中的表具有空的外鍵(b爲null) - 在再前面提到的查詢返回只有行不包含在b字段,並且我想要它們全部。

我猜hibernate加入表而不使用LEFT JOIN(OUTER JOIN?),導致空值被跳過。

有什麼方法可以改變這種行爲嗎?如果我可以通過在實體類中使用註釋來解決它,那將是非常好的,因爲查詢生成機制非常封閉。

+0

你是什麼意思*查詢生成機制相當鎖定*? – 2014-08-27 13:43:10

+0

這是非常通用的,在這裏我得到了有史以來所有查詢的0.001%發生的特殊情況。 – Marcin 2014-08-27 13:57:34

回答

0

您可以使用標準查詢這一點,但你必須同時使用,爲創建會話,它是簡單的訪問使用數據庫標準:

Criteria criteria = session.createCriteria(A.class) 

//create alias of your other class to provide ordering according to foriegn key 

criteria.createAlias("foreignkey","keyin table A(eg..b)"); 
criteria.addOrder(Order.asc(b.name)); 
List list = criteria.getlist(); 

希望這有助於

+0

我不能使用任何其他機制 - 我們將JPQL查詢創建爲字符串,因爲我們有非常大的前端查詢生成機制。 – Marcin 2014-08-28 06:26:25

0

您可以使用CriteriaBuilder和在entityRoot上設置別名

Root<A> entityRoot = criteriaQuery.from(A); 
entityRoot.join("b", JoinType.LEFT).alias("b"); 
criteriaQuery.select(entityRoot) 
       .orderBy(criteriaBuilder.asc(entityRoot.get("b").get("name")) 

;