Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

第9章 ネイティブクエリ

データベースのネイティブ SQL ダイアレクトでクエリを記述することもできます。これは、クエリヒントや Oracle の CONNECT BY オプションなどのデータベース固有の機能を使用する場合に役に立ちます。また、直接的な SQL/JDBC ベースのアプリケーションから Hibernate へのクリーンな移行パスも提供します。Hibernate では、すべての作成操作、更新操作、およびロード操作に対して記述した SQL (ストアドプロシージャを含む) を指定できます (詳細については、リファレンスガイドを参照)。

9.1. 結果セットの記述

SQL クエリを使用するには、SQL 結果セットを定義する必要があります。この定義により、EntityManager を使用してエンティティプロパティに対してカラムをマップできるようになります。これは、@SqlResultSetMapping アノテーションを使用して実行されます。各 @SqlResultSetMapping は、EntityManager に対する SQL クエリの作成時に使用される名前を持ちます。
@SqlResultSetMapping(name="GetNightAndArea", 
    entities={
        @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields
        = {
          @FieldResult(name="id", column="nid"),
          @FieldResult(name="duration", column="night_duration"),
          @FieldResult(name="date", column="night_date"),
          @FieldResult(name="area", column="area_id")
        }),
        @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields
        = {
          @FieldResult(name="id", column="aid"),
          @FieldResult(name="name", column="name")
        })
    }
)

@SqlResultSetMapping(name="defaultSpaceShip",
entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
また、スカラー結果を定義して、エンティティ結果とスカラー結果を混在することもできます。
@SqlResultSetMapping(name="ScalarAndEntities",
  entities={
      @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class,
      fields = {
          @FieldResult(name="id", column="nid"),
          @FieldResult(name="duration", column="night_duration"),
          @FieldResult(name="date", column="night_date"),
          @FieldResult(name="area", column="area_id")
      }),
      @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class,
      fields = {
          @FieldResult(name="id", column="aid"),
          @FieldResult(name="name", column="name")
      })
  },
  columns={
      @ColumnResult(name="durationInSec")
  }
)
SQL クエリは、カラムエイリアス durationInSec を返す必要があります。
@SqlResultSetMapping. に関する詳細については、Hibernate Annotations リファレンスガイドを参照してください。