Определение порядка списка - PullRequest
8 голосов
/ 09 июля 2009

У меня следующая проблема. У меня есть три класса, A, B и C. A содержит связанный с OneToMany список B: s. B содержит отношение ManyToOne к C. C содержит поле с именем «name», а B также содержит поле с именем «name». Чего я хотел бы добиться, так это чтобы элементы в списке А сортировались в основном по имени С, а затем по имени Б - проблема в том, что я не знаю, как это сделать. Это вообще возможно?

Я использую EclipseLink в качестве поставщика JPA.


class A {
   @OneToMany
   @OrderBy("b.c.name, b.name") <---- this is the problem
   List<B> b;
}

class B {
   @ManyToOne
   C c;
   String name;
}

class C {
   String name;
}

EDIT Да, я пробовал разные варианты, например, @OrderBy ("c.name") не работает, я просто получаю сообщение об ошибке, сообщающее, что класс сущности b не содержит поле с именем "c.name"

Ответы [ 5 ]

10 голосов
/ 09 июля 2009

Это НЕ возможно. @OrderBy принимает только прямые имена свойств / полей, а не вложенные свойства. Что действительно имеет смысл, потому что таблица «c» - в зависимости от вашей стратегии извлечения может даже не быть частью выбора, выданного для получения ваших «b».

2 голосов
/ 10 июля 2009

Право ChssPly76.

Что вы можете сделать, это создать именованный запрос, подобный этому:

 SELECT b 
 FROM B b 
 WHERE b.a = :mya 
 ORDER BY b.c.name
0 голосов
/ 06 июля 2018

Это невозможно в javax.persistence.OrderBy (как, скажем, ChssPly76), но когда я использовал Hibernate, я создаю новый столбец в PLAIN SQL с аннотацией Formula (), а затем OrderBy поверх него:

class A {
   @OneToMany
   @OrderBy("orderCol") <---- reference to virtual column
   List<B> b;
}

class B {
   @ManyToOne
   C c;
   String name;

   @org.hibernate.annotations.Formula(
     "( select C_table.name as orderCol from C_table where C_table.id = id )"
   ) <------------------------------------------ join with plain SQL statment
   String orderCol;
}

Может быть, EclipseLink имеет такие же возможности?

0 голосов
/ 09 июля 2009

Вы пробовали:

 @OrderBy("c.name ASC", "name ASC")

0 голосов
/ 09 июля 2009

Вы пробовали @OrderBy("c.name", "name")?

Вы не должны использовать «б». потому что подразумевается, что @OrderBy будет выполняться для столбцов экземпляров B в массиве b.

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