首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hibernate hql如何从父母那里获取匹配的孩子?

hibernate hql如何从父母那里获取匹配的孩子?
EN

Stack Overflow用户
提问于 2011-08-24 00:52:32
回答 3查看 5.9K关注 0票数 2

两个表,Cat和kitten (一对多),kitten表中有5条记录,cat表中有1条记录。小猫有颜色,两只是白色的,三只是黄色的。我写了下面的HQL,它返回猫。

代码语言:javascript
运行
复制
select c from Cat c inner join c.kitten k where k.color='yellow'

这还给我一只猫。但当我这么做的时候

代码语言:javascript
运行
复制
cat.getKitten().size() 

它返回5,而不是3。我想要做的是只获取匹配的孩子,而不是所有的孩子,什么是正确的方法呢?

看起来这样做很有用,感谢zzz和大家的努力

代码语言:javascript
运行
复制
Session session = sessionFactory.getCurrentSession();
        List<Object> funds = session.createQuery("select k.cat,k from kitten k where k.color='yellow'").list();
        Object[] os = (Object[])funds.get(0);
        Cat c = (Cat)os[0];
        Kitten fc = (Kitten)os[1];
        List list = new ArrayList<Kitten>();
        list.add(fc);
        c.setKittens(list);

这会返回正确的结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-24 01:03:34

顺便说一句,这是经过设计的。不能通过使用限制来筛选集合。

如果仔细观察,hibernate会访问DB两次:一次是查询,另一次是获取集合。

你需要先得到你的猫对象,然后再得到过滤后的小猫,默认情况下它是延迟加载的。

就像这样

代码语言:javascript
运行
复制
var kittens= cat.kittens.where(x->x.color="yellow")
var count=kittens.Count();

如果是java,你可以这样做。

代码语言:javascript
运行
复制
Collection<Kitten> kittens= cat.getKittens();
Collection<Kitten> filteredKittens = filterCollection(kittens, session);

您的filterCollection方法将是:

代码语言:javascript
运行
复制
private static <T> Collection<T> filterCollection(Collection<T> collection, Session s) {
        Query filterQuery = s.createFilter(collection, "where this.color='yellow'");
        return filterQuery.list();
    }

这里有一篇关于它的博客文章:http://www.flexpasta.com/index.php/2009/05/20/filtering-hibernate-child-collections/

基于下面的评论,我们决定使用

代码语言:javascript
运行
复制
select g, k from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where k.color ='yellow' 

选择所需的内容,然后将其转换为合适的内容。为了清晰起见,请阅读评论

票数 -1
EN

Stack Overflow用户

发布于 2011-08-24 01:04:57

简而言之,您不想选择猫,而是想选择它的一些小猫:

代码语言:javascript
运行
复制
select k from Cat c inner join c.kitten k where k.color = 'yellow'

这将选择3只小猫,每只小猫都有一只猫。

票数 2
EN

Stack Overflow用户

发布于 2011-08-24 01:05:03

该查询请求所有带有黄色小猫的猫,但是一旦您拥有了猫,您就会请求所有与其相关的小猫(不仅仅是黄色的)。

如果您展示了如何映射/注释Cat/Kitten类,我们可能会为您提供更多帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7164606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档