2010-07-27 3 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 s есть список Thing с:

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> 
Смежные вопросы