JPA Query - Como obter um conjunto de resultados específico?
Pergunta
Em um aplicativo baseado no JPA2/Hibernate/Oracle+Spring+Wicket, eu uso o seguinte modelo:
public class Item {
private String name;
private Set<Application> apps;
private ...
}
public class Application {
private String applicant;
private Item item;
private Status status;
private ...
}
O mapeamento entre item e aplicação é que todo item possui muitos aplicativos, cada aplicativo aponta para apenas um item.
Agora, quero procurar aplicativos que atendam a um conjunto complexo de critérios e seria ótimo se o conjunto de resultados fosse um conjunto de pares <item, list <pplication>> (ele não pode ser apenas definido <tem>, porque geralmente apenas Um subconjunto de aplicativos para um item específico satisfaria os critérios).
Você poderia me recomendar uma maneira de fazer isso? Minha primeira idéia foi consultar primeiro para pares <ItemId, Appid> e depois itera através deles e produzir o conjunto de resultados manualmente, mas parece bastante pesado e ineficaz.
Solução
Se você deseja expressá -lo em uma única consulta (então, você usa JOIN
para expressar critérios no Application
s), a consulta para pares é a única maneira de fazê -lo - é assim que os bancos de dados relacionais funcionam.
Outras dicas
Sugiro o uso de consultas de critérios JPA2 com tuplas e subconsivas. Algo na linha de (pseudocode):
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);
É pseudocódigo porque não tenho a sintaxe exata para as subconsivas em mente agora e nenhum eclipse para experimentá -lo, desculpe. Há uma boa introdução às subconsações em Keith, Schincariol. Pro JPA 2: Dominando a API de persistência Java.