0

Spring MVC を使用して、Hibernate に次の HQL があります。

List<Colour>list=session.createQuery("from Colour order by colourId desc")
.setFirstResult((currentPage-1)*rowsPerPage)
.setMaxResults(rowsPerPage).list();

それは機能し、Oracle 10g のカラー テーブル (実際には私が理解できる Color エンティティ (POJO) で動作します) から行のリストを返します。

リストフィールドを取得する必要がある場合は、次のことを試しています。

List<Colour>list=session.createQuery("colourId, colourName, colourHex from Colour order by colourId desc")
.setFirstResult((currentPage-1)*rowsPerPage)
.setMaxResults(rowsPerPage).list();

例外で終了します

java.lang.IllegalArgumentException: node to traverse cannot be null!

一部の記事では、次のバージョンの HQL が動作するはずである (または動作する可能性がある) と言及されていました。

List<Colour>list=session.createQuery("select colourId, colourName, colourHex from Colour order by colourId desc")
.setFirstResult((currentPage-1)*rowsPerPage)
.setMaxResults(rowsPerPage).list();

残念ながら、それも私にはうまくいきませんでした。このメソッドを使用してネイティブ SQL を実行することもできますが、どうしても必要でない限り、HQLを使用createSQLQuery()したメソッドに固執したいと考えています。createQuery()HQL でフィールドのリストを指定するにはどうすればよいですか?

4

2 に答える 2

2

yorkw さんのコメントに同意します。クエリでプロパティを選択した場合、List<Colour>への呼び出しから返されるオブジェクトを要求することはできません.list()

代わりにこれを行う必要があります

    List<Object[]> rows = session.createQuery("select c.colourId, c.colourName, c.colourHex " +
        " from Colour c " + 
        " order by c.colourId desc").list();

次に、リスト オブジェクトを繰り返し処理し、オブジェクトをインスタンス化します。または、あなたがする必要があることは何でも。

    for ( Object[] row : rows ) {
        Long colourId = (Long)row[0];
        // ... etc
    }
于 2012-08-13T22:20:18.203 に答える
1

地図を作ってみませんか?このようなもの:

SELECT NEW MAP( colour.colourId AS id
              , colour.colourName AS name ...) 
  FROM Colour colour 
  ORDER BY colour.colourId

私は Color "colour" のエイリアスを使用して、休止状態が参照しているエンティティがどのエンティティからのものかを認識できるようにします。これらのプロパティはすべて同じエンティティからのものであることを暗示しています。

于 2012-08-12T16:48:11.077 に答える