两张桌子,猫和小猫(一对多),小猫桌上有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);
这回归正确的事。
答案 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'
并选择所需的内容,然后将其投入适当的内容..阅读评论以获得清晰度