hql 获取有限制的部分集合,即使它们没有任何限制
hql fetching part of collection with restriction even if they don't have any
所以我有一个 Employee 实体和一个 Punch 实体。 Punch 有一个员工和 "created" 的纪元时间,员工有一个 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 查询来获取所有 Employee 仅包含这两个日期之间的工作时间(例如仅包含集合的一部分)。我可以更改我的查询以获得我想要的内容吗?我不知道我能做什么。
SELECT e
FROM Employee e
LEFT JOIN FETCH e.punches p
WHERE p IS NULL OR p.adjustedIn BETWEEN :start AND :end
解决我的问题最简单的方法是使用 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,因为我使用了多个过滤器,其中一些使用了相同的列名。
所以我有一个 Employee 实体和一个 Punch 实体。 Punch 有一个员工和 "created" 的纪元时间,员工有一个 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 查询来获取所有 Employee 仅包含这两个日期之间的工作时间(例如仅包含集合的一部分)。我可以更改我的查询以获得我想要的内容吗?我不知道我能做什么。
SELECT e
FROM Employee e
LEFT JOIN FETCH e.punches p
WHERE p IS NULL OR p.adjustedIn BETWEEN :start AND :end
解决我的问题最简单的方法是使用 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,因为我使用了多个过滤器,其中一些使用了相同的列名。