JPA:如何筛选关联?

JPA:如何筛选关联?,jpa,jpa-2.0,criteria-api,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

我的模型:

@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;
}
@实体
班主任{
@身份证
长id;
@独身癖
Set employments=new HashSet();
}
@实体
阶级就业{
@身份证
长id;
@许多酮
公司;
日期从;
日期至;
}
它是
公司
之间的关联,受时间间隔的限制

我正在寻找一个JPA标准查询,以选择给定时间的所有
人员及其工作

预期结果是一个包含所有人员的
列表
,其中每个
人员的
雇员
集合只包含符合特定标准的雇员(或根本不包含雇员)

@其中
不是一种明智的方法,因为员工的筛选标准是可变的,例如,我希望在任何给定时间选择一个人的所有员工


这样做合理吗?有什么不同的建议吗?

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

我只需将一个多人协会从
Employment
添加到
Person
,然后搜索Employment。如果您需要人员集,只需遍历employments并将每个employment的人员添加到一个集合中即可。如果您希望在该日期与他们的工作相关联的人员,您可以使用自定义类或
多重映射

String hql=“从就业中选择就业”
+“左加入获取就业。人员”
+“其中:employment.startDate和employment.endDate之间的日期”;
List employments=session.createQuery(hql)
.setDate(“日期”,日期)
.list();

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

我只需将一个多人协会从
Employment
添加到
Person
,然后搜索Employment。如果您需要人员集,只需遍历employments并将每个employment的人员添加到一个集合中即可。如果您希望在该日期与他们的工作相关联的人员,您可以使用自定义类或
多重映射

String hql=“从就业中选择就业”
+“左加入获取就业。人员”
+“其中:employment.startDate和employment.endDate之间的日期”;
List employments=session.createQuery(hql)
.setDate(“日期”,日期)
.list();

谢谢你的提示!搜索关系而不是主实体是一个好主意。谢谢你的提示!搜索关系而不是主实体是一个好主意。
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();