连接休眠限制

问题描述:

我试图构建由各种组件组成的标准。想象下面的映射类。连接休眠限制

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”是不是关联。在添加限制之前手动创建条件的需求看起来应该不是必需的,但它仍然是..尝试在第二种形式中使用别名也失败。

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>