Будьте в спящем режиме ограничения с соединениями

Я пытающийся создать Критерии составил из различных компонентов. Вообразите отображенные классы ниже.

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" не является ассоциацией. Потребность вручную создать критерии прежде, чем добавить ограничение кажется чем-то, что не должно быть необходимо, но это.. Попытки использовать псевдоним во второй форме также перестали работать.

1
задан Ernest Smithers 27 July 2010 в 03:40
поделиться

1 ответ

Есть ли у пользователей список объектов 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>
2
ответ дан 2 September 2019 в 22:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: