критерии гибернации - PullRequest
       0

критерии гибернации

7 голосов
/ 02 сентября 2010

Я не могу использовать сортировку в таблицах соединений. Позвольте мне объяснить;

У меня есть три стола. пользователи, роли и user_roles. мои сущности JPA: пользователь, пользовательская роль, пользовательская роль, роль.

|User    |     | UserRole |     | UserRolePK |     | Role |
|--------|     |----------|     --------------     --------
|id      |     | pk       |     | user       |     | id   |
|name    |                      | role       |     | name |

на самом деле вывод, который я хочу: "SELECT * FROM user_roles ur Присоединяйтесь к пользователям u ON u.ID = ur.UserID ORDER BY u.name;"

, поэтому я пытаюсь использовать API критериев гибернации.

CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.addOrder(Order.asc("pk.user.name"));
List userRoles = criteria.list();

Ошибка не удалось разрешить свойство: pk.user.name of: models.UserRole

как использовать API критериев в таблицах объединения?

Ответы [ 3 ]

10 голосов
/ 02 сентября 2010

Если класс ссылается на другие классы, вы не можете просто получить доступ к их свойствам в Ограничениях и Заказах.Вам нужно будет создать псевдоним для указанных объектов, а затем использовать псевдоним для определения Ограничений и Порядков для других объектов.

Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class);
criteria.createAlias("pk", "a1");
criteria.createAlias("a1.user", "a2");
criteria.addOrder(Order.asc("a2.name"));
List userRoles = criteria.list();

Определения псевдонимов создадут соединение с таблицами других классов.Только ограничения, которые непосредственно сопоставлены с таблицей класса или псевдонимом, могут использоваться в Ограничениях или Заказах.Если ваш класс содержит компоненты, они могут быть доступны напрямую без псевдонима.

1 голос
/ 02 сентября 2010

довольно просто, просто используйте createCriteria для ассоциаций:

Criteria c=session.createCriteria(User.class)
                  .createCriteria("roles")
                  .add(Restrictions.eq("name","test")
                  .list();

Это объединит две таблицы для пользователя Entites и связанных с ним "ролей" Коллекции.и вернул бы всех пользователей, чья роль связана с самим собой, называемой «тест».

надеюсь, что помогло

1 голос
/ 02 сентября 2010

Ну, во-первых, я думаю, что мы должны увидеть сопоставления ваших сущностей (Java-классы)

С другой стороны, я предполагаю, что ваш класс UserRole имеет ссылку на экземпляр User.

   @Entity
    @Table (name="UserRole")
    public class UserRole{

        User user;

        @OneToMany //correct mapping here
        public User getUser(){return this.user;}


    }

Вы должны использовать createCriteria для навигации по ассоциации .

public List<UserRole> getRolesWithUser(){
    Criteria userRoleCriteria = session.createCriteria(UserRole.class);
    userRoleCriteria.createCriteria("user"); //joins the table.
    userRoleCriteria.addOrder("user.name"); //adds order

    return criteria.list();
}

Проблема в том, что он принесет экземпляры UserRole, но вы можете перейти к User.

List<UserRole> userRoles = getRolesWithUser();

for (UserRole role:userRoles){

   User user = role.getUser();
   //do something with role , user
}

Взгляните на Criteria API . Это всегда полезно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...