题
下面的类结构被给出:
class Job
{
String description;
Collection<JobHistory> history;
}
class JobHistory
{
Date assignDate;
User jobOwner;
}
class JobOwner
{
String name;
String id;
}
这类结构上经由JPA分贝访问。在DAO-层I可以编写查询在JPA语法。
问题:我要与给定的ID,谁是在工作(由assignDate订购)的Job
最后一个给定的所有者JobHistory
和Jobhistory
项目列表。听起来很复杂,也许更简单:给我所有的工作和JobHistory
其中指定的所有者是作业的实际拥有者。
<强>更新:强>为了清楚起见,我会稍微改变类的名称
class Job
{
String description;
Collection<JobOwnerHistory> history;
}
class JobOwnerHistory
{
Date assignDate;
User jobOwner;
}
class JobOwner
{
String name;
String id;
}
每个Job
都有自己的业主通过assignDate
排序的历史。实际的所有者获得最后的分配(即MAX(assignDate)
)的工作。我要找到每一个工作与JobOwnerHistory
的MAX(assignDate)
进入特定用户User
。
解决方案
尝试:
SELECT j, j.history FROM Job j JOIN User u WHERE u.name = :name
如果我是这样做的EclipseLink的,我会稍微改变:
public List<Job> getAllJobsForUser(String username) {
List<Job> jobs = entityManager
.createQuery("SELECT j FROM Job j JOIN User u WHERE u.name = :name")
.setParameter("name", username)
.setHint(QueryHints.BATCH, "j.history")
.queryForList();
}
的差异?在第一个版本,你返回两个对象,所以你必须从列表中检索它们或对象数组,而在第二,查询提示只是加载从(assumedly)lazyy所有作业历史一个一对多的关系
我不知道是否Hibernate有一个相当于此。 Toplink的精华没有。但它是我最喜欢的EclipseLink的功能之一。
哦,很明显,你可以(并且可能应该)使用一个命名查询,而不是即席查询像我做了(因为这些可以在构建过程中验证)。
其他提示
我发现下面的答案为查询:
SELECT j, h FROM Job j JOIN j.history h JOIN h.jobOwner u
WHERE u.name = :name AND
(SELECT MAX(h2.assignDate) FROM Job j2 JOIN j2.history h2
WHERE h2 member of j.history) = h.assignDate
在查询中最重要的部分是与子查询的 MAX(h2.assignDate)
,因为我想要得到这份工作,并在业主历史上最新的项目。
不隶属于 StackOverflow