заказ в JPA не работает - PullRequest
       3

заказ в JPA не работает

0 голосов
/ 21 сентября 2011

Я использую JPA с реализацией Hibernate. У меня есть именованный запрос, как в сущности MyTable:

@NamedQuery(name = "myQuery", query = "select val from MyTable val") 

Сущность myTable содержит внешнюю ключевую связь с другой сущностью.

@OneToMany(mappedBy = "myTable ", cascade = { CascadeType.ALL }, fetch = FetchType.LAZY)
private Set<ReferenceTable> tbl;

В объекте ReferenceTable есть поле, которое мне нужно получить в отсортированном порядке, когда JPA выполняет именованный запрос, показанный выше. Я пытался @OrderBy, но это не сработало.

Любая помощь будет высоко ценится.

Спасибо, НКС

Ответы [ 3 ]

1 голос
/ 21 сентября 2011

Очевидно, что @OrderBy плохо работает с реализацией JPA в Hibernate:

http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html#entity-mapping-association-collections

Это то, что вы используете?

В любом случае, попробуйте добавить "order by" в ваш запрос JPQL, например,

выбрать ... заказать по столу DESC

Кроме того, если вам нужна полная гибкость, сделайте собственный SQL-запрос, в котором вы выбираете свои вещи и заказываете их по своему вкусу. Вы даже можете указать свой собственный запрос, какой класс должен маршалировать результаты, так что вы получите почти то же самое, что и запрос JPQL, но с большей точностью по фактическому запросу:

@NamedNativeQuery(

имя = "myQuery", query = "SELECT .... order by ... asc" resultClass = MyJPAEntity.class )

Вы можете использовать вышеперечисленное как аннотацию уровня класса для вашего класса EJB.

И да, я получаю иронию от использования платформы orm, но все еще вынужден вернуться к базовому SQL.

0 голосов
/ 14 января 2013

Если вы не используете org.hibernate.annotations.Sort, который сортирует в Java с использованием компаратора, вам лучше без java.util.Set. Использование set не поможет вам с упорядочением (лучшее, что Hibernate может выбрать здесь, это LinkedHashSet). Я также сомневаюсь, что вы используете его, чтобы убедиться, что элемент уникален.

Я думаю, вам лучше использовать java.util.Collection, которая является наиболее общей. Hibernate использует ArrayList по умолчанию, который будет сохранять порядок набора результатов. Тем не менее, реализация @OrderBy в Hibernate плохая, похоже, она не полностью реализует JPA 2.0, в том числе и в 4.1.9. Это также может быть причиной ваших проблем.

0 голосов
/ 21 сентября 2011

Set <..> impl будет неупорядоченным, даже если DB / JPA вернет упорядоченную коллекцию.вы можете использовать SortedSet, как показано в этом примере из документации по спящему режиму

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="CUST_ID")
@Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
public SortedSet<Ticket> getTickets() {
    return tickets;
}

source: http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html#collections-sorted

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