27.3. 使い方
Hibernate Search はアノテーションを使ってエンティティを Lucene のインデックスにマップします。 詳細については リファレンスマニュアル を参照してください。
Hibernate Search は API および JPA や Hibernate のセマンティックと完全に統合されています。 HQL ベースまたは検索条件ベースの問い合わせからの切り替えにはほとんどコードを必要としません。 アプリケーションは主に Hibernate の
Session のサブクラスとなる FullTextSession API と連携します。
Hibernate Search が存在する場合は、JBoss Seam は
FullTextSession をインジェクトします。
@Stateful
@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
@In FullTextSession session;
public void search(String searchString) {
org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
org.hibernate.Query query session.createFullTextQuery(luceneQuery,
Product.class);
searchResults = query
.setMaxResults(pageSize + 1)
.setFirstResult(pageSize * currentPage)
.list();
}
[...]
}
注記
ここでは、
FullTextSession が org.hibernate.Session を拡張しているため通常の Hibernate Session として使用することができます。
JPA を使用した場合、より円滑な統合が提案されます。
@Stateful
@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
@In FullTextEntityManager em;
public void search(String searchString) {
org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
javax.persistence.Query query = em.createFullTextQuery(luceneQuery,
Product.class);
searchResults = query
.setMaxResults(pageSize + 1)
.setFirstResult(pageSize * currentPage)
.getResultList();
}
[...]
}
FullTextEntityManager は Hibernate Search が存在するところにインジェクトされます。 FullTextEntityManager は検索固有のメソッドで EntityManager を拡張します。 同様にして FullTextSession は Session を拡張します。
EJB 3.0 Session またはメッセージ駆動型 Beanのインジェクションが使用される場合 (つまりインジェクションが
@PersistenceContext アノテーションを使用) は、宣言ステートメント内で FullTextEntityManager インターフェースを使うことで EntityManager インタフェースの置換はできません。 ただし、 インジェクトされる実装は FullTextEntityManager 実装になり、 ダウンキャストが可能です。
@Stateful
@Name("search")
public class FullTextSearchAction implements FullTextSearch, Serializable {
@PersistenceContext EntityManager em;
public void search(String searchString) {
org.apache.lucene.search.Query luceneQuery = getLuceneQuery();
FullTextEntityManager ftEm = (FullTextEntityManager) em;
javax.persistence.Query query =
ftEm.createFullTextQuery(luceneQuery, Product.class);
searchResults = query
.setMaxResults(pageSize + 1)
.setFirstResult(pageSize * currentPage)
.getResultList();
}
[...]
}
注記
Seam の外側で Hibernate Search を使用するのに慣れている方は、 Hibernate Search が Seam と統合されるときは
Search.createFullTextSession を使用する必要がないことを覚えておいてください。
Hibernate Search の作業サンプルについては JBoss Seam ディストリビューションの Blog サンプルか DVDStore をご確認ください。