2010-09-02 3 views
6

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

У меня есть три стола. пользователей, ролей и user_roles. мои объекты JPA - это User, UserRole, UserRolePK, Role.

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

на самом деле вывод, что я хочу: "SELECT * FROM user_roles Ур РЕГИСТРИРУЙТЕСЬ пользователи Мириэль 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 из: models.UserRole

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

ответ

9

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

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(); 

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

+0

кажется хорошим, но он не работает. Неизвестный столбец 'a2x2_.Имя 'in' order clause ' и это запрос sql, который был сгенерирован с помощью API критериев. __ "выберите this_.RoleID как RoleID614_0_, this_.UserID as UserID614_0_ из user_roles this_ order by a2x2_.Name asc" __ –

+0

Возможно, что-то не так с отображением. Создание псевдонима должно обычно соединяться с таблицей, если свойство является отношением «много к одному». Графики таблиц не содержат никаких отношений. Может быть, вы должны добавить их или добавить сопоставление в вопрос. – Reboot

1

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

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

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

     User user; 

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


    } 

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

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. Его всегда полезно!

+0

В таблице user_roles столбцы UserID и RoleID являются первичными ключами. Поэтому я использовал встроенный ключ и дополнительный класс (UserRolePK) для него. UserRolePK имеет правильное сопоставление. –

1

довольно легко использовать только createCriteria на ассоциации:

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

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

надежда, что помогло

+0

Существует не так много свойств отношения, как роли в объекте пользователя. Вместо этого я использовал объект UserRole. –

Смежные вопросы