Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 使用HQL限制集合中的项目_Hibernate_Hql - Fatal编程技术网

Hibernate 使用HQL限制集合中的项目

Hibernate 使用HQL限制集合中的项目,hibernate,hql,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 但它不起作用,因为这个查询只选择那些至少有一只超过两个月大的小狗的人,而不选择那些只有两个

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

现在,我们想编写HQL查询,它将列出所有名为“John”的人,但也将小狗限制在2个月以上的人

我的第一次尝试是这样的:

SELECT p FROM Person p
JOIN FETCH p.puppies pu
WHERE p.name = 'John'
AND pu.age > 2
但它不起作用,因为这个查询只选择那些至少有一只超过两个月大的小狗的人,而不选择那些只有两个月大的小狗的人。我也希望看到他们的小狗名单是空的

实际上,我希望实现类似(伪代码)的功能:

。因此,可以使用左(外)连接,如下所示:

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

这应该给你所有没有小狗的约翰。你说“……但不是那些只有年轻人的人”。我不太明白。如果明确声明
和pu.age>2
,你为什么要看到那些幼犬呢?

我用

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

@Entity
@FilterDef(name="olderThan", parameters=@ParamDef( name="months", type="integer" ) )
public class Person{
  @OneToMany
  @Filter(name="olderThan", condition="age > :months")
  private List<Puppy> puppies;
}
@实体
@FilterDef(name=“olderThan”,parameters=@ParamDef(name=“months”,type=“integer”))
公共阶层人士{
@独身癖
@过滤器(name=“olderThan”,condition=“age>:months”)
私人名单小狗;
}
然后在执行查询过滤器之前,必须启用:

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();
  }
}
公共类PersonRepository{
@持久上下文
私人实体管理者;
公共列表查找PoppiesLimitedToolderThan(整数个月)的人员{
em.unwrap(Session.class).enableFilter(“olderThan”).setParameter(“月”,月);
返回em.createQuery(“从Person LEFT JOIN FETCH p.puppies中选择p,其中p.name='John',Person.class”).getResultList();
}
}

一切正常。

这不是我想要的。顺便说一句,我的查询是这样的(只是没有外部,如果使用LEFT,这是可选的)。也许我没有足够平淡地解释我的问题是什么。我想要所有名字为约翰的人,但是限制他们的罂粟花在2个月以前。因此,如果有一些约翰和2只小狗:1个月和3个月,我应该得到它只有一只小狗。如果有第二个约翰和一只小狗在一起,也就是一个月,那么我仍然应该得到这个人,只有空的小狗列表。(看看我的伪代码查询,我想它说明了这个想法)
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();
  }
}