2011-10-31 1 views
4

私はID、名前、色、形状の4つの列を持つテーブルフルーツを持っています。表中のJPA Query.getResultList()からカスタマイズされたTOへのマッピングリスト

エントリは次のようになります。

1, apple, red, round 
2, banana, yellow, long 
3, tomato, red, round 
4, orange, orange, round 

は今、私は上記の表にマッピングされたエンティティクラスのフルーツを作りました。私のDAOクラスで

@Entity 
@Table(name="fruit") 
public class Fruit implements Serializable { 

@Id 
@Column(name="ID") 
String id; 

@Column(name="NAME") 
String name; 

@Column(name="COLOR") 
String color; 

@Column(name="SHAPE") 
String shape; 

//getters/setters goes here 
} 

は、コードは次のとおりです。

String myQuery = "Select f.shape, f.name from Fruit f where f.shape = :shape"; 
Query query = this.em.createQuery(myQuery); 
query.setParameter("shape", "round"); 

明らかなように、クエリの上で実行すると、3行を返します。

私は、クエリによって返される行に準拠するために、この

class FruitSearchTO 
{ 
    String shape; 
    String name; 

    //getters/setters here 
} 

クラスFruitSearchTO TOシンプルを持っています。

しかし、私のDAOで実行されているようなもの:

List<FruitSearchTO> fruitList = new ArrayList<FruitSearchTO>(); 
fruitList = query.getResultList(); 

が例外java.lang.ClassCastExceptionがを投げている:[Ljava.lang.Object。 FruitSearchTOと互換性がありません]

ここで私は間違っていますが、これに対する解決策は何ですか?位置1の

答えて

6

あなたがList<Object[]>を返します使用しているHQLは、Listの各要素が位置0でshapeの配列であることとname

あなたはHQLはAliasToBeanResultTransformerを使用してList<FruitSearchTO>を返すことができます。 FruitSearchTOが適切なコンストラクタを持っている場合

List fruitList = s.createQuery(
    "select f.shape as shape, f.name as name from Fruit f where f.shape = :shape;") 
    .setParameter("shape", paramShape) 
    .setResultTransformer(Transformers.aliasToBean(FruitSearchTO.class)) 
    .list(); 
FruitSearchTOdto = (FruitSearchTO) fruitList .get(0); 

また、:,あなたもselect new FruitSearchTO(f.shape, f.name)でこれを達成することができます。

HQLのHibernate Referenceの章、特に15.6 The select clauseの章を見てください。

+0

ありがとうございました。私はこれを試してみましょう! – Nik

+0

あなたは以前の答えを貼り付けてください。私はHibernateの古いバージョンを使用していて、ResultTransformerメソッドを持っていません。 – Nik

+0

が手に入りました!ありがとう..私はバージョンの問題のため、上記の答えを確認できませんでした。しかし、イテレーターのバージョンは動作しました! – Nik

4

JPQLにはNEW演算子があります。この演算子を使用すると、エンティティ自体である必要はなく、オンザフライでオブジェクトのインスタンスを作成できます(DTOはエンティティではありません) 。

ベンダー固有のソリューションを使用したくない場合は、NEW演算子を使用するか、生成されたObject []を反復処理して自分でDTOを作成してください。

これらはあなたにとって興味深い材料かもしれません:How can I avoid the creation of superfluous entities?およびa bit about the NEW operator

関連する問題