所以我有一个Employee实体和一个Punch实体。 Punch有一个员工和它创建时间的时间段#34;并且员工有一个Punch列表。
Employee.java
@Entity
public class Employee extends AbstractScheduleEntity<EmployeeSchedule>
{
//AbstractScheduleEntity also extends AbstractServerEntity
@Fetch(FetchMode.SELECT)
@CollectionType(type = "ca.tecsar.core.sql.LazySetType")
@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY)
private Set<Punch> punches;
//Constructors, getters and setters
}
Punch.java
@Entity
public class Punch extends AbstractServerEntity {
//AbstractServerEntity has the @Id and few others field
@ManyToOne
@JoinColumn(nullable = false)
private Employee employee;
private long adjustedIn = -1;
//Constructors, getters and setters
}
所以我使用HQL查询来获取所有只有这两个日期之间的冲突的员工(比如只是集合的一部分)。有什么可以改变我的查询来获得我想要的东西?我不明白我能做些什么。
SELECT e
FROM Employee e
LEFT JOIN FETCH e.punches p
WHERE p IS NULL OR p.adjustedIn BETWEEN :start AND :end
答案 0 :(得分:0)
解决我问题的最简单方法是使用Hibernate的过滤器。 在我的Employee模型中,我只需要为我的集合声明我的过滤器:
@Fetch(FetchMode.SELECT)
@CollectionType(type = "ca.tecsar.core.sql.LazySetType")
@OneToMany(mappedBy = "employee", fetch = FetchType.LAZY)
@Filter(
name="punchesBetweenDates",
condition="{p}.adjustedIn >= :start and {p}.adjustedIn < :end",
aliases = {
@SqlFragmentAlias(alias = "p", table = "PUNCH")
}
)
private Set<Punch> punches;
然后在我的查询中启用它:
session.enableFilter("punchesBetweenDates")
.setParameter("start", start)
.setParameter("end", end);
我必须使用@SqlFragmentAlias,因为我使用的是多个过滤器,其中一些使用相同的列名。