34

複数のテーブルを含む複雑なクエリを作成しており、結果を一覧表示する必要があります。通常、私は を使用しEntityManager、結果を JPA 表現にマップします。

UserEntity user = em.find(UserEntity.class, "5");

次に、ユーザーUserEntityクラスで定義されているすべての値にアクセスできます。しかし、ネイティブの複数テーブル クエリから返されたフィールド値にアクセスするにはどうすればよいでしょうか? 私が得るのはオブジェクトのリストです。ここまでは問題ありませんが、そのオブジェクトとは何ですか? 配列?地図?コレクション?...

//simpleExample
Query query = em.createNativeQuery("SELECT u.name,s.something FROM user u, someTable s WHERE s.user_id = u.id");
List list = query.getResultList();

//do sth. with the list, for example access "something" for every result row.

答えは非常に単純だと思いますが、そこにあるほとんどの例は、targetClass に直接キャストするときの使用法を示しているだけです。

PS: この例では、もちろんクラス マッピングを使用できます。しかし、私の場合someTableはJPAによって管理されていないため、エンティティもクラス表現もありません.20個のテーブルに参加しているので、すべてのクラスを作成したくありません値にアクセスするだけです。

4

8 に答える 8

58

一般的なルールは次のとおりです。

  • select単一の式を含み、それがエンティティである場合、結果はそのエンティティです
  • select単一の式を含み、それがプリミティブの場合、結果はそのプリミティブになります
  • select複数の式が含まれている場合、結果にはObject[]対応するプリミティブ/エンティティが含まれます

したがって、あなたの場合listList<Object[]>.

于 2012-12-04T10:37:55.287 に答える
53

JPA 2.0 から aTypedQueryを使用できます。

TypedQuery<SimpleEntity> q = 
        em.createQuery("select t from SimpleEntity t", SimpleEntity.class);

List<SimpleEntity> listOfSimpleEntities = q.getResultList();
for (SimpleEntity entity : listOfSimpleEntities) {
    // do something useful with entity;
}
于 2014-01-25T18:39:43.843 に答える
9

結果にアクセスするためのより便利な方法が必要な場合は、任意の複雑な SQL クエリの結果を最小限の手間で Java クラスに変換することができます。

Query query = em.createNativeQuery("select 42 as age, 'Bob' as name from dual", 
        MyTest.class);
MyTest myTest = (MyTest) query.getResultList().get(0);
assertEquals("Bob", myTest.name);

クラスは @Entity として宣言する必要があります。つまり、一意の @Id を持つようにする必要があります。

@Entity
class MyTest {
    @Id String name;
    int age;
}
于 2014-05-05T21:45:26.220 に答える
8

上記のクエリは、Object[] のリストを返します。したがって、リストから u.name と s.something を取得したい場合は、対応するクラスの値を反復してキャストする必要があります。

于 2012-12-04T10:33:03.100 に答える
0

ハイバネートを 5.4.30.final 以上のバージョンに更新することもできます

于 2021-05-18T22:59:16.323 に答える