【问题标题】:Getting Collections using Projection(hibernate)使用投影获取集合(休眠)
【发布时间】:2013-08-05 14:36:54
【问题描述】:

Employee.java

public class Employee
{
String id;
String name;
List<String> designations;
List<String> qualifications;
}

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 对象并获取列表。我尝试了预测,但徒劳无功。

Criteria criteria = session.createCriteria(c);
ProjectionList proList = Projections.projectionList();
proList.add(Projections.property("designations"));
criteria.setProjection(proList);
List list = criteria.list();

我得到了以下异常堆栈跟踪。

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)

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    既然designations 是一个列表,你应该join

        try {
                Criteria criteria = session.createCriteria(Employee.class);
                criteria.setFetchMode("designations", FetchMode.JOIN);
                 List list = criteria.list();
    
            } catch (Exception e) {
                 //print e 
            }
    

    【讨论】:

    • 我应该在 ProjectionList 中传递什么??
    • 很好,除了子标准。你能解释一下如何在这个例子中进行吗??
    • 是Class对象。这里类
    【解决方案2】:

    不可能获取带有条件的元素集合(阅读here)。您必须使用本机 SQL

    【讨论】:

    • java.lang.ArrayIndexOutOfBoundsException 看起来像是“不可能”的一个非常奇怪的拼写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-26
    • 2011-04-11
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多