Hibernateの検索について
インデックスへ戻る ネイティブSQLクエリSQLをHibernateで使う方法を見ていきたいと思います。。 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のすべてのプロパティを意味しています。
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();
}
おすすめ書籍
|