2010-07-27 143 views
1

我試圖構建由各種組件組成的標準。想象下面的映射類。連接休眠限制

class Thing { 
    Inner inner; 
    String x; 
} 

class User { 
    Id; // mapped as id. 
    String first; // indexed columns etc 
    String last; 
} 

我想創造東西的地方[email protected][email protected]查詢(又名標準)。我可以通過創建用戶的根目錄下的子標準,然後將限制條件添加到此來輕鬆實現此目的。

Critera root = ... 
root.add(Restrictions.eq("xxx", @2)); 

Criteria user = root.createCritera("user"); 
user.add(Restrictions.eq("first", @1)); 
...etc 

但是我不能創建和事情和用戶屬性使用類似代碼...

Critera root = ... 
root.add(Restrictions.and(Restrictions.eq("user.first", @1), Restrictions.eq("thing.x", @2)); 

一個QueryException拋出的是「user.first」是不是關聯。在添加限制之前手動創建條件的需求看起來應該不是必需的,但它仍然是..嘗試在第二種形式中使用別名也失敗。

回答

2

User s有一個列表Thing s?或者Thing s有一個User s的列表?

下面的例子指出User■找的Thing的List:

Criteria user = root.createCritera("User"); 
user.add(Restrictions.eq("first", @1)); 
user.createAlias("usersSetOfThings", "userThings", Criteria.INNER_JOIN); 
user.add(Restrictions.eq("userThings.x", @2)); 
user.list(); 

這些映射將上面的代碼運行:

<class name='User' table='your user table name'> 
    <id name='id' column='ID' type='long' /> 
    <property name='first' column='FIRST' type='string' /> 
    <property last='last' column='LAST' type='string' /> 
    <set name='usersSetOfThings' table='what_did_you_do_to_link_them_in_the_DB?'> 
     <key column='id' /> 
     <one-to-many column='whatever_you_did.user_id_fk_column_name' 
      class='full.package.name.Thing' /> 
    </set> 
</class> 

<class name='thing' table='your things table name'> 
    <many-to-one name="Inner" class="full.package.name.Inner" fetch="select"> 
     <column name="inner_FK" /> 
    </many-to-one> 
    <property name='x' type='string' /> 
</class>