使用Projection获取集合(休眠) [英] Getting Collections using Projection(hibernate)
本文介绍了使用Projection获取集合(休眠)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
Employee.java
Employee.java
public class Employee
{
String id;
String name;
List<String> designations;
List<String> qualifications;
}
Employee.hbm.xml
Employee.hbm.xml
<hibernate-mapping>
<class name="com.novelty.Employee" table="Employee">
<id column="ID" name="id" type="long">
<generator class="increment"/>
</id>
<property column="name" name="name"/>
<list lazy="false" name="designations" table="designations">
<key column="ID"/>
<list-index column="idx"/>
<element column="designation" type="string"/>
</list>
<list lazy="false" name="qualifications" table="qualifications">
<key column="ID"/>
<list-index column="idx"/>
<element column="qualification" type="string"/>
</list>
</hibernate-mapping>
我需要获取特定雇员的指定列表(我具有姓名或ID).我不想整体获取Employee对象并获取列表.我尝试了投影,但徒劳无功.
I need to get the list of designation for a particular employee(I have name or id).I don't want to get the Employee object as a whole and get the list. I tried with projections but futile.
Criteria criteria = session.createCriteria(c);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("designations"));
criteria.setProjection(proList);
List list = criteria.list();
我得到了以下异常堆栈跟踪.
I got the following exception stack trace.
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
at org.hibernate.loader.criteria.CriteriaLoader.getResultColumnOrRow(CriteriaLoader.java:148)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639)
at org.hibernate.loader.Loader.doQuery(Loader.java:829)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
at org.hibernate.loader.Loader.doList(Loader.java:2533)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
at org.hibernate.loader.Loader.list(Loader.java:2271)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)
推荐答案
由于designations
是列表,因此您应该join
它
Since designations
is a list you should join
it
try {
Criteria criteria = session.createCriteria(Employee.class);
criteria.setFetchMode("designations", FetchMode.JOIN);
List list = criteria.list();
} catch (Exception e) {
//print e
}
这篇关于使用Projection获取集合(休眠)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文