即使他们没有

时间:2018-02-09 14:18:02

标签: java hibernate hql

所以我有一个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

1 个答案:

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