2010-10-25 3 views
2

В приложении на основе JPA2/Hibernate/Oracle + Spring + калитке, я использую следующую модель:JPA Query - как получить определенный набор результатов?

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

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

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

Теперь я хочу, чтобы искать для приложений, удовлетворяющих комплексный набор критериев, и было бы здорово, если набор результатов был набор пар < Item, Список < Application >> (он не может быть просто Установить < Элемент> , потому что обычно только подмножество приложений для определенного элемента будет соответствовать критериям).

Не могли бы вы порекомендовать мне способ, как это сделать? Моя первая идея заключалась в том, чтобы сначала запросить пары < ItemID, AppID>, а затем повторить их и создать набор результатов вручную, но он кажется довольно громоздким и неэффективным.

ответ

1

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

0

Я предлагаю использовать критерии критериев 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, чтобы попробовать его, извините. В подзапросах есть хорошее введение в Keith, Schincariol. Pro JPA 2: Mastering the Java Persistence API.

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