【问题标题】:JPA: How to filter an association?JPA:如何过滤关联?
【发布时间】:2012-09-24 19:25:32
【问题描述】:

我的模特:

@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 条件查询来选择所有 Persons 及其在给定时间的工作。

预期结果是一个包含所有人的List&lt;Person&gt;,其中每个Person 的集合employments 仅包含符合特定条件的工作(或根本没有工作)。 p>

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

这甚至是合理的做法吗?任何建议如何以不同的方式做到这一点?

【问题讨论】:

    标签: jpa jpa-2.0 criteria-api


    【解决方案1】:

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

    我会简单地从EmploymentPerson 添加一个多对一关联,然后搜索工作。如果您需要一组人员,只需遍历就业并将每个就业的人员添加到一个集合中。如果您希望在此日期与他们的工作相关联的人,您可以使用自定义类或MultiMap&lt;Person, Employment&gt;

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

    【讨论】:

    • 感谢您的提示!搜索关系而不是主要实体是个好主意。
    猜你喜欢
    • 2015-07-10
    • 1970-01-01
    • 2021-09-02
    • 1970-01-01
    • 2015-01-04
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多