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

时间:2011-08-23 16:52:32

标签: hibernate

两张桌子,猫和小猫(一对多),小猫桌上有5条记录,猫桌上有1条记录。小猫有颜色,2白色和3黄色。我编写了以下HQL来返回Cat。

select c from Cat c inner join c.kitten k where k.color='yellow'
这回报了我的猫。但是当我做的时候

cat.getKitten().size() 

它返回5而不是3.我想要做的只是获得匹配的孩子而不是所有人,这是正确的方法吗?

看起来好像这样做,感谢zzz和每个人的努力

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);

这回归正确的事。

3 个答案:

答案 0 :(得分:2)

简而言之,您不想选择猫,但想要选择一些小猫:

select k from Cat c inner join c.kitten k where k.color = 'yellow'

这将选择3只小猫,每只小猫都有相同的猫。

答案 1 :(得分:0)

查询要求所有带有黄色小猫的猫,但是一旦你有了猫,你就会要求它所有相关的小猫(而不仅仅是黄色小猫)。

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

答案 2 :(得分:-1)

顺便说一句,这是设计的。您无法使用限制来过滤集合。

如果你仔细观察,hibernate将进入数据库两次:一次查询,一次获取集合。

您需要先获取cat对象,然后获取默认延迟加载的过滤小猫。

类似

var kittens= cat.kittens.where(x->x.color="yellow")
var count=kittens.Count();

如果java你可以做这样的事情

Collection<Kitten> kittens= cat.getKittens();
Collection<Kitten> filteredKittens = filterCollection(kittens, session);

并且您的filterCollection方法将是:

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/

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

select g, k from grandCat g inner join fetch g.cat c inner join fetch c.kitten k where k.color ='yellow' 

并选择所需的内容,然后将其投入适当的内容..阅读评论以获得清晰度