1

過去 4 時間、名前付きクエリの結果をキャストするためにグーグルで検索したチュートリアルを探して試してみましたが、実行可能な解決策が見つかりませんでした。以下のコードのスニピットを実行すると、java.lang.ClassCastExceptionエラーが発生します (以下を参照)。

sessionCriteria(うまくいった)を使用してレコード全体の結果を取得することから、を使用して3つのテーブル列のみを返すことに切り替えましたgetNamedQuery


元のコード ブロック

Criteria sessionCriteria = session.createCriteria(RunContainer.class);

@SuppressWarnings ("unchecked")
List<RunContainer> runContainer = sessionCriteria.list();

名前付きクエリ コード ブロック

Query query = session.getNamedQuery("RunContainer.GetRunsForCalendar");

List results = query.list();

for(int i = 0; i < results.size(); i++){
    RunContainer result = (RunContainer)results.get(i);
    System.out.println(result.getNotes());
}

RunContainer テーブル クラス

@Entity
@Table (name = "container")
@NamedQueries ( {
    @NamedQuery (name = "RunContainer.GetRunsForCalendar", 
        query = "SELECT id, date, notes FROM RunContainer")
    })
public class RunContainer {

    @Id
    @GeneratedValue
    @Column (columnDefinition = "INT UNSIGNED")
    private Integer id;

    private Date date;

    @Column(columnDefinition = "TEXT")
    private String notes;

    ...

エラー

java.lang.ClassCastException:
[Ljava.lang.Object; cannot be cast to com.scene7.is.qa.jorogumo.tables.RunContainer

これをデバッグするのを手伝ってくれる人はいますか? 私はJavaにかなり慣れていないので、これが私の最初の仕事関連のプロジェクトです。


受け入れられた回答からの作業コード

誰かがこの投稿に出くわした場合に備えて、次のコードは、受け入れられた回答から得られたものです。

Query query = session.getNamedQuery("RunContainer.GetRunsForCalendar");
List<Object> containerResults = query.list();
List<RunContainer> runContainers = new ArrayList<RunContainer>();

for (Object result : containerResults) {

    Object[] temp = (Object[]) result;
    RunContainer runContainer = new RunContainer();

    runContainer.setId((Integer) temp[0]);
    runContainer.setDate((Date) temp[1]);
    runContainer.setNotes((String) temp[2]);

    runContainers.add(runContainer);
}
4

2 に答える 2

3

SELECT句は、複数の列またはエンティティをクエリします。結果は、getResultList()によって返されるjava.util.Listのオブジェクト配列(Object [])に集約されます。

ここではRunContainer、問題の原因となるキャストを行っています。リストを繰り返し処理し、配列から個々のフィールドをフェッチします。

List containerResults = query.List(); 

    for(Object[] result : containerResults) 
    {
       Integer id = (Integer) result[0];
       Date date = (Date) result[1];
       String notes = (String) result[2];
    }

[注:コンパイルせずにサンプルコードを提供し、それに応じて変更を加えます]


編集:または、選択したフィールドがエンティティのフィールド名と同じである場合は、試すことができます

session.createSQLQuery("SELECT id, date, notes FROM RunContainer").addEntity(RunContainer.class);

詳細については、こちらを参照してください。

于 2013-03-01T05:45:02.987 に答える
0

これを試してください: query.setResultTransformer(Transformers.aliasToBean(RunContainer.class)); ここのドキュメントを参照してください:http://docs.jboss.org/hibernate/orm/3.2/api/org/hibernate/Query.html#setResultTransformer(org.hibernate.transform.ResultTransformer)

于 2013-03-01T05:32:37.950 に答える