2011-11-23 138 views
3

我想根據關聯關聯的對象的值搜索我的數據源中的所有對象實例。數據模型可以簡化爲:類型A的對象保存類型B的對象的列表。目標是查找A的所有實例,其中A包含B使得B具有屬性值X.休眠:按示例查詢關聯等效條件查詢

I已經可以順利實現這一使用條件查詢如下:

List<A> results = session.createCriteria(A.class) 
    .createCriteria("listOfBs") 
    .add(Restrictions.eq("propertyInB", x)) 
    .list(); 

這是一種簡化,和B的多個屬性將適用 - 搜索功能是必要的用戶填充過濾器。

我想用示例查詢來替換這種方法 - 我只需用所需的參數創建一個對象圖。我遵循Hibernate文檔的嘗試失敗,並在this question中描述。

我認爲這可能有助於證明我試圖以一種有效的方式實現,然後尋求等價物 - 這就是爲什麼我重新提出這個問題的原因。

總之,我的問題是:你將如何在Hibernate中將上述Criteria Query作爲示例的查詢來實現?我正在使用Hibernate 3.6.6。

謝謝!

回答

5

假設你想要做的事,如:

Select a.* , b* 
from a join b on a.id = b.id 
where a.property1 = "wwww" 
and a.property2="xxxx" 
and b.property1="yyyy" 
and b.property2="zzzz" 

要實現使用實例查詢(QBE)上面的查詢:

/***Initialize an instance of Class A with the properties that you want to match***/ 
A instanceA = new A(); 
instanceA.setProperty1("wwww"); 
instanceA.setProperty2("xxxx"); 
Example exampleA = Example.create(instanceA); 

/***Do the same for the Class B**/ 
B instanceB = new B(); 
instanceB.setProperty1("yyyy"); 
instanceB.setProperty2("zzzz"); 
Example exampleB = Example.create(instanceB); 

/**Create and execute the QBE***/ 
List<A> results = session.createCriteria(A.class) 
    .add(exampleA) 
    .createCriteria("b",CriteriaSpecification.LEFT_JOIN) // b is the property of Class A 
    .add(exampleB) 
    .list(); 

結果已被取指令 - 加盟,這意味着A中的集合實例B已經完全初始化。

+0

謝謝你的答案肯。我試過這個,但碰到與我以前的問題相同的問題(http://stackoverflow.com/questions/7976491/hibernate-query-by-example-involving-one-to-many-relationship) - org.hibernate。 QueryException:無法解析屬性:_com of B.您是否有任何想法可能會出錯? –

+0

我現在不知道。通常情況下,如果你在代碼中編寫了一些無效的路徑,例如'.createCriteria(「_ com」,CriteriaSpecification.LEFT_JOIN)','_com'不是你的實體的屬性,那麼'無法解析屬性'會發生。 –

+0

不幸的是,_com不是我在任何地方定義的屬性/字段,這對我不起作用。此外,_com不是我的工作區中包含的任何庫中存在的屬性名稱。然而,這是文檔建議我們爲QBE所做的事情,因此我會將其標記爲答案..我必須去似乎沒有QBE。 –