JPA Query - как получить конкретный набор результатов? - PullRequest
2 голосов
/ 25 октября 2010

В приложении на основе JPA2 / Hibernate / Oracle + Spring + Wicket я использую следующую модель:

public class Item {
 private String name;
 private Set<Application> apps;
 private ...
}

public class Application {
 private String applicant;
 private Item item;
 private Status status;
 private ...
}

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

Теперь я хочу найти Приложения, которые удовлетворяют сложному набору критериев, и было бы здорово, если бы набор результатов был набором пар > (это не может быть просто Set потому что, как правило, только подмножество заявок на конкретный элемент удовлетворяет критериям).

Не могли бы вы порекомендовать мне, как это сделать? Моя первая идея состояла в том, чтобы сначала запросить пары , а затем выполнить итерацию по ним и вручную создать результирующий набор, но он кажется довольно громоздким и неэффективным.

Ответы [ 2 ]

1 голос
/ 25 октября 2010

Если вы хотите выразить это в одном запросе (то есть вы используете JOIN для выражения критериев на Application s), запрос пар является единственным способом сделать это - так работают реляционные базы данных.

0 голосов
/ 28 октября 2010

Я предлагаю использовать критерии запроса JPA2 с кортежами и подзапросами. Что-то в строке (псевдокод):

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Tuple> crit = cb.createTupleQuery();
Subquery<Application> subquery = cb.subquery(Application.class);
subquery.where(...);
subquery.correlate(...);
crit.select(cb.tuple(cb.from(Item.class), subquery);

Это псевдокод, потому что сейчас у меня нет точного синтаксиса для подзапросов и нет Eclipse, чтобы попробовать его, извините. Есть хорошее введение в подзапросы в Кит, Schincariol. Pro JPA 2: освоение API персистентности Java .

...