JPA:如何过滤关联?

时间:2012-09-24 10:47:09

标签: jpa jpa-2.0 criteria-api

我的模特:

@Entity
class Person {
    @Id
    long id;
    @OneToMany
    Set<Employment> employments =  new HashSet<Employment>();
}

@Entity
class Employment {
    @Id
    long id;
    @ManyToOne
    Company company;
    Date from;
    Date until;
}

这是PersonCompany之间的关联,受到时间间隔的限制。

我正在寻找一个JPA标准查询,以便在给定时间选择所有Person及其就业。

预期结果是包含所有人的List<Person>,其中每个employments的集合Person仅包含符合特定条件的工作(或没有任务)在所有)。

@Where不是一种明智的做法,因为就业的过滤标准是可变的,例如我想在任何时候选择一个人的所有工作。

这是否合理?有什么建议如何以不同的方式做到这一点?

1 个答案:

答案 0 :(得分:1)

不,这样做不合理。实体应该表示数据库中的数据,而不是特定查询返回的日期。

我只需添加从EmploymentPerson的ManyToOne关联,然后搜索就业情况。如果您需要这组人员,只需迭代工作并将每个就业人员添加到一个集合中。如果您希望在此日期与其工作相关的人员,您可以使用自定义课程,或MultiMap<Person, Employment>

String hql = "select employment from Employment employment"
             + " left join fetch employment.person"
             + " where :date between employment.startDate and employment.endDate";
List<Employment> employments = session.createQuery(hql)
                                      .setDate("date", date)
                                      .list();