2013-12-08 85 views
0

我有一個對象內的對象,並希望使用最內部對象內的一個字段創建一個限制。現在我想這可以通過做類似的事情來實現:休眠Crtieria和限制不能正常工作

... .add(Restrictions.eq(「myObjectTwp.myObjectThree.myObjectsID」,mySearchId)).list();

但是,這似乎並不奏效。但是,我沒有收到任何錯誤消息,而是幾乎看起來像沒有考慮到這個限制。

+0

您需要使用的次或者別名,正如標準查詢中有關關聯的文檔章節中所解釋的:http://docs.jboss.org/hibernate/core/4.2/manual/en-US/html_single/#querycriteria-associations –

回答

0

您需要進行連接。在標準的API,這樣做最簡單的方法是使用createAlias()方法:

session.createCriteria(Child.class, "child") 
     .createAlias("child.parent", "theParent") 
     .add(Restrictions.eq("theParent.someField", theFieldValue)) 
     .list(); 

此查詢等同於以下HQL:

select child from Child child 
inner join child.parent theParent 
where theParent.someField = :theFieldValue 
0

我認爲這將有助於你分享你的映射文件(或註釋)。

舉例來說,在我的項目,我有以下幾點:

<hibernate-mapping> 
    <class name="Client" table="Client"> 
    ... 
    <many-to-one name="user" class="User" column="idUser"/> 

而且

<hibernate-mapping> 
    <class name="User" table="User"> 
    <property name="email" type="string"/> 

閱讀在的Hiberante文檔http://docs.jboss.org/hibernate/core/4.0/manual/en-US/html/querycriteria.html#querycriteria-associations如果我想查詢與特定用戶的電子郵件客戶端(合併JB Nizet的評論):

List clients = sess.createCriteria(Client.class) 
        .createAlias("user", "u") 
        .add(Restrictions.eq("u.email", "[email protected]")) 
        .list(); 

我不是無論如何。

+0

不,您需要一個別名或子標準:'q.createAlias(「user」,「theUser」); q.add(Restrictions.eq(「theUser.email」,「[email protected]」));' –

+0

我認爲這可能有幫助http://docs.jboss.org/hibernate/core/4.0/manual/ zh-CN/html/querycriteria.html#querycriteria-associations –

+0

@JBNizet如果您可以將您的評論作爲答案解決了問題,謝謝。 – user1383163