2

在我的模型中,我有两个实体: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'
4

2 回答 2

0

我设法使用 休眠过滤器解决了我的问题

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

@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();
  }
}

一切正常。

于 2013-01-14T21:19:58.097 回答
0

HQL 支持各种连接。因此,您可以像这样使用左(外)连接:

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

这也应该给你所有没有小狗的约翰。你说“......但不是那些只有更年轻的人​​”。不是很明白。如果明确声明,您为什么要看到那些有更年轻的小狗的人AND pu.age > 2

于 2013-01-12T20:08:14.083 回答