Ограничения гибернации с объединениями - PullRequest
1 голос
/ 27 июля 2010

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

class Thing {
   Inner inner;
   String x;
}

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

Я хотел бы создать запрос (он же Criterion) для вещей, где User.first=@1 и User.last=@2. Я могу легко добиться этого, создав для пользователя подкритерии, а затем добавив к нему ограничения.

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

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

Однако я не могу создать AND для свойства вещи и пользователя, используя код, подобный ...

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

Выдается исключение QueryException, что user.first не является ассоциацией. Необходимость вручную создавать критерии перед добавлением ограничения, кажется, не обязательна, но все же есть. Попытки использовать псевдоним во второй форме также не удаются.

1 Ответ

2 голосов
/ 27 июля 2010

У User s есть список Thing s?Или Thing s имеет список 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...