解决JPA查询查找连接列表中的最后一个条目

时间:2009-01-14 10:08:52

标签: java jpa dao

给出了以下类结构:

class Job 
{
    String description;
    Collection<JobHistory> history;
}

class JobHistory
{
    Date assignDate;
    User jobOwner;
}

class JobOwner 
{
    String name;
    String id;
}

可以通过JPA在db上访问此类结构。在DAO-Layer中,我可以用JPA语法编写查询。

问题:我想要一个包含JobJobHistory条目的列表,其中包含给定ID的给定所有者,以及该作业的Jobhistory中的最后一个(按assignDate排序) )。听起来很复杂,也许更简单:给我所有工作和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的{​​{1}}条目MAX(assignDate)的每个作业。

2 个答案:

答案 0 :(得分:2)

我为查询找到了以下答案:

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) 进行子选择,因为我想获取作业以及所有者历史记录中的最新条目。

答案 1 :(得分:1)

尝试:

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();
}

区别?在第一个版本中,您将返回两个对象,因此您必须从List或Object数组中检索它们,而在第二个版本中,查询提示只会从(假设的)懒惰的一对多关系中加载所有作业历史记录

我不知道Hibernate是否具有与之相当的功能。 Toplink Essentials没有。但它是我最喜欢的EclipseLink功能之一。

哦,显然你可以(并且可能应该)使用命名查询而不是像我所做的那样的adhoc查询(因为这些可以在构建期间进行验证)。