使用HQL限制集合中的项目

时间:2013-01-12 11:06:23

标签: hibernate hql

在我的模型中,我有两个实体:Person和Puppy(简化它:))。他们之间有一对多关系,所以每个人都有小狗的集合。

现在想要编写HQL查询,该查询将列出名称为“John”的所有人,但也限制小狗超过2个月。

我的第一次尝试看起来像这样:

SELECT p FROM Person p
JOIN FETCH p.puppies pu
WHERE p.name = 'John'
AND pu.age > 2

但它不起作用,因为此查询仅选择那些至少有一只小于两个月的小狗而不是那些只有较小的小狗的人。而且我也希望看到它们只是空小狗列表。

实际上我想实现类似(伪代码)的东西:

SELECT p FROM Person p
JOIN FETCH p.puppies pu HAVING (pu.age > 2 )
WHERE p.name = 'John'

2 个答案:

答案 0 :(得分:0)

HQL supports various kinds of joins。因此,您可以像这样使用左(外)连接:

FROM Person p
LEFT OUTER JOIN p.puppies pu
WHERE p.name = 'John'
AND pu.age > 2

这应该给你所有没有小狗的约翰。你说“......但不是那些只有年轻人的人”。不太明白。如果明确声明AND pu.age > 2

,为什么你想看到那些年幼小狗?

答案 1 :(得分:0)

我设法使用hibernate filters

解决我的问题

首先我必须定义我的过滤器:

@Entity
@FilterDef(name="olderThan", parameters=@ParamDef( name="months", type="integer" ) )
public class Person{
  @OneToMany
  @Filter(name="olderThan", condition="age > :months")
  private List<Puppy> puppies;
}

然后在执行查询过滤器之前必须启用:

public class PersonRepository{
  @PersistenceContext
  private EntityManager em;

  public List<Person> findPeopleWithPoppiesLimitedToOlderThan(int months){
    em.unwrap(Session.class).enableFilter("olderThan").setParameter("months", months);
    return em.createQuery("SELECT p FROM Person LEFT JOIN FETCH p.puppies WHERE p.name = 'John'", Person.class).getResultList();
  }
}

一切正常。