powerdee.com
Google
 
このサイト内 Web
 
カウンタ

Hibernateの検索について

インデックスへ戻る
前回作成したスキーマを使っていろいろな方法で検索してみたいと思います。

ネイティブSQLクエリ

SQLをHibernateで使う方法を見ていきたいと思います。。
SessionクラスのcreateSQLQueryを利用するのですが、Hibernate3からシグネチャと戻り値が変更されてますね。

SQLQuery createSQLQuery(String queryString)

まずは、親カテゴリを取得するSQLを実行してみます。

    public void testNativeSQLQuery() throws Exception {
        Session session = getSession();
        
        String SQL
            = "select {cat.*} from CATEGORY cat " +
            		"where cat.PARENT_CATEGORY_ID is null";
        
        SQLQuery query = session.createSQLQuery(SQL);
        query.addEntity("cat", Category.class);

        List categoryList = query.list();
        assertEquals(1, categoryList.size());
        Category parentCategory = (Category) categoryList.get(0);
        assertEquals("親カテゴリ", parentCategory.getName());

        session.close();
    }

結果は以下のようなSQLが発行されました。

select 
  cat.CATEGORY_ID as CATEGORY1_0_0_, 
  cat.NAME as NAME0_0_, 
  cat.INSERT_DATE as INSERT3_0_0_, 
  cat.UPDATE_DATE as UPDATE4_0_0_, 
  cat.DELETE_DATE as DELETE5_0_0_, 
  cat.PARENT_CATEGORY_ID as PARENT6_0_0_ 
from 
  CATEGORY cat 
where 
  cat.PARENT_CATEGORY_ID is null

ここで使われた{cat.*}というプレースホルダのcatは、Categoryクラスのエイリアスであり、cat.*という指定がCategoryのすべてのプロパティを意味しています。
あと、from句の"CATEGORY cat"でテーブルエイリアスをcatとして定義していますが、以下のように省略しても問題なく動きます。但し、エイリアス名がテーブル名と同じでない場合例外になりますので、ご注意を。

        String SQL
            = "select {category.*} from category " +
            		"where category.PARENT_CATEGORY_ID is null";

        SQLQuery query = session.createSQLQuery(SQL);
        query.addEntity("category", Category.class);

以下のように、特定のプロパティのみ指定しても例外が発生してしまいます。 結局{cat.*}として全てのプロパティを指定しないといけないようです。

    public void testNativeSQLQuery() throws Exception {
        Session session = getSession();
        
        String SQL
            = "select cat.NAME as {cat.name} from CATEGORY cat " +
            		"where cat.PARENT_CATEGORY_ID is null";
        
        SQLQuery query = session.createSQLQuery(SQL);
        query.addEntity("cat", Category.class);

        List categoryList = query.list();
        assertEquals(1, categoryList.size());
        Category parentCategory = (Category) categoryList.get(0);
        assertEquals("親カテゴリ", parentCategory.getName());

        session.close();
    }

以下のSQLが発行されたが、例外が発生してしまいます。たぶん、HibernateがcategoryIdを取得しようとしたのでしょう。

select 
  cat.NAME as NAME0_0_ 
from 
  CATEGORY cat 
where 
  cat.PARENT_CATEGORY_ID is null

↓ 例外発生
java.sql.SQLException: Column 'CATEGORY1_0_0_' not found.

結合クエリを発行する

以下のような複数のエンティティを戻す結合クエリを実行すると、HibernateはObjectの配列でエンティティを返してきます。

    public void testNativeSQLQuery2() throws Exception {
        Session session = getSession();
        
        String SQL
            = "select {parent.*}, {child.*} " +
            		"from CATEGORY parent inner join CATEGORY child " +
            		"on parent.CATEGORY_ID = child.PARENT_CATEGORY_ID ";
        
        SQLQuery query = session.createSQLQuery(SQL);
        query.addEntity("parent", Category.class);
        query.addEntity("child", Category.class);

        List categoryList = query.list();
        assertEquals(1, categoryList.size());
        Object[] categoryArray = (Object[]) categoryList.get(0);
        Category parentCategory = (Category) categoryArray[0];
        assertEquals("親カテゴリ", parentCategory.getName());
        
        Category childCategory = (Category) categoryArray[1];
        assertEquals("子カテゴリ", childCategory.getName());
        
        session.close();
    }

インデックスへ戻る


おすすめ書籍


HIBERNATE イン アクション

著者:Christain Bauer、Gavin Ki
出版社:ソフトバンク クリエイティブ(2005-12-28)
価格:¥4,410(税込)
Light Weight Java―JSF/Hibernate/SpringによるフレームワークでWebアプリケーションの開発効率向上

著者:岡本 隆史、金子 崇之、吉田 英嗣、権藤 夏男
出版社:毎日コミュニケーションズ(2005-04)
価格:¥3,360(税込)


ページTopへ / ▲Homeへ