0

従業員.java

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

従業員.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 を持っています)。従業員オブジェクト全体を取得してリストを取得したくありません。投影を試みましたが無駄でした。

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)
4

2 に答える 2

1

designations リストな ので、あなたはjoinそれをすべきです

    try {
            Criteria criteria = session.createCriteria(Employee.class);
            criteria.setFetchMode("designations", FetchMode.JOIN);
             List list = criteria.list();

        } catch (Exception e) {
             //print e 
        }
于 2013-08-05T14:39:46.550 に答える
0

条件付きの要素のコレクションを取得することはできません (こちらをお読みください)。ネイティブ SQL を使用する必要があります

于 2013-08-05T18:44:48.623 に答える