Я пытающийся создать Критерии составил из различных компонентов. Вообразите отображенные классы ниже.
class Thing {
Inner inner;
String x;
}
class User {
Id; // mapped as id.
String first; // indexed columns etc
String last;
}
Я хотел бы создать запрос (иначе Критерий) для Вещей где User.first = 1 и User.last = 2. Я могу легко достигнуть этого путем создания sub критериев от корня для Пользователя и затем добавления Ограничений на это.
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" не является ассоциацией. Потребность вручную создать критерии прежде, чем добавить ограничение кажется чем-то, что не должно быть необходимо, но это.. Попытки использовать псевдоним во второй форме также перестали работать.
Есть ли у пользователей
список объектов Thing
? Или у Thing
есть список User
s?
В приведенном ниже примере указано, что User
s имеют список Thing
s :
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>