两个表,Cat和kitten (一对多),kitten表中有5条记录,cat表中有1条记录。小猫有颜色,两只是白色的,三只是黄色的。我写了下面的HQL,它返回猫。
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);这会返回正确的结果。
发布于 2011-08-24 01:03:34
顺便说一句,这是经过设计的。不能通过使用限制来筛选集合。
如果仔细观察,hibernate会访问DB两次:一次是查询,另一次是获取集合。
你需要先得到你的猫对象,然后再得到过滤后的小猫,默认情况下它是延迟加载的。
就像这样
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' 选择所需的内容,然后将其转换为合适的内容。为了清晰起见,请阅读评论
发布于 2011-08-24 01:04:57
简而言之,您不想选择猫,而是想选择它的一些小猫:
select k from Cat c inner join c.kitten k where k.color = 'yellow'这将选择3只小猫,每只小猫都有一只猫。
发布于 2011-08-24 01:05:03
该查询请求所有带有黄色小猫的猫,但是一旦您拥有了猫,您就会请求所有与其相关的小猫(不仅仅是黄色的)。
如果您展示了如何映射/注释Cat/Kitten类,我们可能会为您提供更多帮助。
https://stackoverflow.com/questions/7164606
复制相似问题