在基于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 ...
}
Item和Application之间的映射是每个项目都有很多应用程序,每个应用程序只指向一个项目。
现在我想搜索满足一组复杂条件的应用程序,如果结果集是一组对,那就很好了。项目,列表&lt;申请&gt;&gt; (它不能只是Set&lt; Item&gt;,因为通常只有特定项目的应用程序子集才能满足标准。)
你能推荐我一个怎么做的方法吗?我的第一个想法是首先查询对&lt; ItemID,AppID&gt;然后迭代这些并手动生成结果集,但它看起来非常麻烦且无效。
答案 0 :(得分:1)
如果你想在一个查询中表达它(所以,你使用JOIN
来表达Application
s上的标准),查询对是唯一的方法 - 这是关系的方式数据库工作。
答案 1 :(得分: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中有一个很好的子查询介绍。