Спящий сорт по свойствам внутреннего боба - PullRequest
3 голосов
/ 18 декабря 2009

В моей доменной модели у меня есть следующие классы. У UserProfile есть один SecurityPrincipal

class SecurityPrincipal{
 private String loginId;
 private String password;
 private Date registeredData;
 private int status;
}



class UserProfile {

private String name;
private String company;
private SecurityPrincipa principal

}

Я хочу получить отсортированные результаты объектов 'UserProfile', и он отлично работает для простых свойств. Как

DetachedCriteria criteria=DetachedCriteria.forClass(UserProfile.class);     

criteria.addOrder(Order.asc("name");

Но когда я пытаюсь получить доступ к свойствам внутреннего компонента (экземпляр SecurityPrincipal), например

criteria.addOrder(Order.asc("principal.status");

Hibernate выдает ошибку:

вызвано: org.hibernate.QueryException: мог не разрешать свойство: securityPrincipal.status из: com.bigg.ibmd.usermanagement.model.UserProfile в org.hibernate.persister.entity.AbstractPropertyMapping.propertyException (AbstractPropertyMapping.java:44) в org.hibernate.persister.entity.AbstractPropertyMapping.toColumns (AbstractPropertyMapping.java:59) в org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns (BasicEntityPropertyMapping.java:31)

Как мне отсортировать результаты по свойствам собственности?

Спасибо

Ответы [ 2 ]

4 голосов
/ 18 декабря 2009

Попробуйте это:

DetachedCriteria criteria=DetachedCriteria.forClass(UserProfile.class);         
criteria.createAlias("principal", "p");
criteria.addOrder(Order.asc("p.name"));

Я не пробовал, и не уверен, что это самый хороший способ, но я думаю, что он должен работать.

0 голосов
/ 16 мая 2014

Для фильтрации по нескольким полям вы должны использовать аннотацию @OrderBy. Например:

@ OrderBy («идентификатор, имя, что угодно») частный принципал SecurityPrincipa ...

Обратите внимание: JPA Criteria api 2.0 создает OUTER JOIN для коллекций. Это означает, что если в таблице есть не отношение «один к одному», а «один ко многим», это приводит к нескольким результатам:

@ OrderBy ("вес, рост") Частная коллекция userVitalStatsCollection;

Чтобы избежать дубликатов, удобно использовать представление базы данных.

...