【问题标题】:Hibernate HQL or Criteria alternative for Filters to Filter on Collection (One to Many) object filedsHibernate HQL 或 Criteria 替代过滤器以过滤集合(一对多)对象文件
【发布时间】:2015-12-30 06:02:01
【问题描述】:

[更改标题]

我正在处理父子关系,我们需要过滤子实体的字段。还有一些在 Parent 和 Child 中定义的 Collections 是 EAGER fetch。

当尝试使用 HQL 结果是错误的,构建的子对象比我预期的要多。

我的对象关系:

Cat -> Kitten  (One to Many)
Kitten -> Owner (One to One)
Kitten -> Vet_Doctor (One to One)

数据:

Cat1
  -> KittenA - Male
  -> KittenB - Male
  -> KittenC - Female

还有欧文斯、医生等,

HQL:

select distinct cats from Cat as cats
    inner join cats.kitten as kittens
    left outer join kittens.owner
    left outer join kittens.doctor
where kittens.gender = :gender 

当我搜索 'male' 时,结果同时包含雄性和雌性小猫,这是错误的。

来自日志的查询(类似这样):

select distinct cats.id, cats.name, cats.age 
from Cat as cats
        inner join cats.Kitten on Kitten.catid = Cat.id
        left outer join Owner on Kitten.ownerid = Owner.id
        left outer join Vet_Doctor on Kitten.doctorid = Vet_Doctor.id
 where Kitten.gender = 'male';


select Kitten.id, Kitten.name, Owner.name, Vet_Doctor.name 
from Cat
        inner join Kitten on Kitten.catid = Cat.id
        left outer join Owner on Kitten.ownerid = Owner.id
        left outer join Vet_Doctor on Kitten.doctorid = Vet_Doctor.id
 where Cat.id = 1;

我发现可以使用 Hibernate Filters 来过滤子对象。但是如何使用 HQL 或 Criteria 来做到这一点?

任何人都可以请帮助,在此先感谢。

【问题讨论】:

    标签: java hibernate jpa orm hql


    【解决方案1】:

    请尝试以这种方式重写查询(当然是模板)

    select distinct Cat 
      from Cat cat inner join cat.kitten kitten
      where kitten.gender = :gender
    

    更新

    在您的 HQL 查询中,您不需要连接 kittens.owner 和 kittens.doctor,因为您没有在 where 子句中使用它。就用这个

    select distinct cats from Cat as cats
        inner join cats.kitten as kittens
    where kittens.gender = :gender
    

    【讨论】:

    • 谢谢你,我按照你说的试过了,但结果还是一样。在检查解决这个问题时,我发现有办法在休眠中使用过滤器过滤集合(子实体)。但我正在寻找如何在 HQL 或使用标准中做到这一点。
    • @skstar 请将您的持久类添加到您的问题中以检查您的映射。
    • 编辑了我的问题,基于我发现休眠构建对象仅过滤返回的内容时的正常行为,在我的情况下它是父对象列表(猫)。要过滤子对象需要使用过滤器。但我正在寻找如何使用 HQL 或 Criteria 来实现这一目标。
    猜你喜欢
    • 2011-01-20
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2018-01-10
    • 2017-06-06
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多