2009-06-12 52 views
2

这里的情况:如何构建一个使用集合中所有元素的单个元素的hibernate查询?

我有具有一对多的参照数据类型P. 数据类型P上的数据类型C具有一个可选的R参考(一对一)。

我试图查询结果如下(这是一个数,但它也将被用来拉数据)

FROM C WHERE ... AND P.R.rProperty LIKE 'BLAH%'; 

我得到一个

org.hibernate.QueryException: illegal attempt to dereference collection 
[C.C_SEQUENCE_NUMBER.P] with element property reference [R] [select count(*) FROM C a WHERE a.DATE_FIELD >= ? AND a.DATE_FIELD <= ? AND a.P.R.rProperty LIKE ?] 

任何提示/建议吗?

回答

0

我失去了一些东西在这里还是应

FROM C c WHERE ... AND c.p.r LIKE 'BLAH%'; 

嗯,让我们改写这个正确

Class Foo { 
    public List<Bars>getBars(); 
} 

class Bar { 
    public Baz getBaz(); 
} 

其中foo是你的C,酒吧是你的P和巴兹是你的[R 然后你的hql就像

from Foo f where f.bars.baz like 'BLAHH' 
0

你可以从实体P开始,只要这个有到包含实体C的“返回链接”,即所谓的双向映射。

您可以通过使用ResultTransformer指定select或Criteria来实现HQL。

例如

select p.C from P p where p.r.property like 'BLAH%'; 

s.createCriteria(P.class) 
.createAlias("c","toSelect") 
.createCriteria("r") 
.add(Restrictions.like("property","BLAH%") 
.setResultTransformer(new ResultTransformer() { 
     public Object transformTuple(Object[] tuple, String[] aliases) { 
     for (int i = 0; i < aliases.length; i++) { 
      if ("toSelect").equals(aliases[i])) { 
      return tuple[i]; 
      } 
     } 
     throw new RuntimeException("What?"); 
     } 
    ... 
    }) 
.list(); 
1

请尝试以下

"FROM EntityC c inner join EntityP p WHERE p.R.rProperty LIKE 'BLAH%'" 
1

我知道这是迟到的方式为你,但它可能会帮助别人。据我所知,你不能引用“子属性”。在某种程度上,这是LOD (Law Of Demeter)的一种表现形式,这意味着您只能使用一个点。即使在这个类层次结构中不是这种情况,那么nhibernate就是希望你引用hql中的对象/属性。所以,你可以写这样的:

from C c 
inner join fetch P p 
inner join fetch R r 
where r.rProperty like 'BLAH%'; 

的获取是有告诉Hibernate/NHibernate的跃跃欲试加载实体避免SELECT N + 1点的问题。我想你想在这种情况下预先加载所有实体。

+0

它为我工作,坦克你。 – OJVM 2012-10-26 20:52:50

相关问题