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,因为我使用了多个过滤器,其中一些使用了相同的列名。