下面的类结构被给出:

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最后一个给定的所有者JobHistoryJobhistory项目列表。听起来很复杂,也许更简单:给我所有的工作和JobHistory其中指定的所有者是作业的实际拥有者。

<强>更新:为了清楚起见,我会稍微改变类的名称

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

class JobOwnerHistory
{
    Date assignDate;
    User jobOwner;
}

class JobOwner 
{
    String name;
    String id;
}

每个Job都有自己的业主通过assignDate排序的历史。实际的所有者获得最后的分配(即MAX(assignDate))的工作。我要找到每一个工作与JobOwnerHistoryMAX(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) ,因为我想要得到这份工作,并在业主历史上最新的项目。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top