1

给出了以下类结构:

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

class JobHistory
{
    Date assignDate;
    User jobOwner;
}

class JobOwner 
{
    String name;
    String id;
}

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

问题:我想要一个列表,其中包含具有给定 ID 的给定所有者的条目,并且谁是工作中的最后一个Job(按 assignDate 排序)。听起来很复杂,也许更简单:给我所有工作,并且指定的所有者是工作的实际所有者。JobHistoryJobhistoryJobHistory

更新:为清楚起见,我将稍微更改类的名称。

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

4

2 回答 2

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)因为我想获得工作和所有者历史中的最新条目。

于 2009-01-24T05:53:50.027 回答
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 特性之一。

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

于 2009-01-14T10:28:36.463 回答