3

オブジェクトのリストを返すことに問題があります。@EmbeddedId以下のコードでわかるように、エンティティ クラスを使用しています。同様のテキストが 2 行ありますid.*

Criteria cr = createCriteria(true);
cr.add(Restrictions.eq("id.qwerty", "QWERTY"));

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("id.qwerty"));
projectionList.add(Projections.property("text"));
projectionList.add(Projections.property("id.property"));
cr.setProjection(projectionList);
cr.setResultTransformer(Transformers.aliasToBean(My.class));

List<My> myList = (List<My>) cr.list();

return myList;

List<My> messagesList = (List<My>) cr.list();で以下のエラーが発生しました。

java.lang.ClassCastException: my.package.dao.domain.My cannot be cast to [Ljava.lang.Object;
at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:104)
at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2274)
at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2206)
at org.hibernate.loader.Loader.list(Loader.java:2164)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1706)
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347)

この場合、Criteriaまたはどのように定義できますか?ProjectionList

編集

@javax.persistence.Entity
@Table(name = "my_table")
public class My extends MyEntity<MyPK> {

   @EmbeddedId
   private MyPK id;

   @Column(name = "text", nullable = false)
   protected String text;

   @ManyToOne
   @JoinColumn(name = "property", nullable = false, insertable = false, updatable = false)
   protected Option option;

   @Override
   public MyPK getId() {
       return id;
   }

   @Override
   public void setId(MyPK id) {
       this.id = id;
   }

   //getters and setter
   //equlas and hashCode
}

そしてMyPKクラス:

@Embeddable
public class MyPK implements Serializable {

   @Column(name = "qwerty")
   protected String qwerty;

   @Column(name = "property")
   protected String property;

   //constructors, getters and setters
}
4

1 に答える 1

5

Criteria で setProjection() を使用している場合、 list() メソッドは、射影リストに追加したプロパティの数に応じて、List<Object>またはのタイプを返します。List<Object[]>

これは、My インスタンスを独自に作成する必要があることを意味します。

    List<My> myList = new ArrayList<My>();
    for (Object[] row : cr.list()) {
         My m = new My();
         m.setQwerty((String) row[0]);
         // set the rest of the properties
         myList.add(m);
    }

あなたが見ている ClassCastException は、list()メソッドがインスタンスを返しているが、ResultTransformer を設定してインスタンスObjectを明示的に要求したためだと思いますMy

JBNizet が回答した同様の質問はこちら

于 2012-10-13T12:56:11.957 に答える