質問: ### 前提・実現したいこと NetBeans jsf JAVADB を用いて書籍管理のwebアプリを作成しています。 現在は検索フォームにISBN番号(主キー)を入れるとそれに該当するデータが帰ってくるというものになっております。 しかし、これではあまりにも実用性に欠けるので、検索フォームに文字を入力しそれに該当するタイトルの書籍を表示させたいです。 (例:検索フォームにjaと入力→結果フォームに書籍名にjaを含むデータリスト一覧が返される) 主キーによる検索はEntityManagerのfindメソッドを用いて行えるようになったのですが、前述した機能のメソッドがわかりません。 教えていただけると幸いです。 ### 該当のソースコード JAVA package beans; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; @Stateless public class Worker02 { @PersistenceContext//エンティティ・マネージャーをインジェクトする private EntityManager em;//インジェクトしたデータをemにセット public void register(BookEntity02 be) { em.persist(be);//データベースへの登録メソッド } public void update(BookEntity02 be) { em.merge(be); } public BookEntity02 find(String key) { return em.find(BookEntity02.class, key); } public void delete(BookEntity02 be) { em.remove(em.merge(be)); } public List getData() { return em.createQuery("SELECT r FROM BookEntity02 r").getResultList(); } }
回答: JPAを利用していると仮定して。 下記ページにあるようにNamedQueryを利用することで実現できるかと思います。 * http://typea.info/blg/glob/2014/05/java-ee-7-7-jpa-1.html タイトル検索用メソッドを以下のように定義してみてはいかがでしょうか。 ``` // Worker02のタイトル検索用メソッド(前方一致) public List findByTitle(String title) { return em.createNamedQuery(BookEntity02.SELECT_BY_TITLE) .setParameter("title", title + "%") .getResultList(); } ``` BookEntity02には上記で利用しているNamedQueryを定義しておきます。 ``` @NamedQueries({ @NamedQuery(name=BookEntity02.SELECT_BY_TITLE, query="select b from [テーブル名] b where b.title like :title")}) public class BookEntity02 { // NamedQuery定義: タイトルでの検索 public static final String SELECT_BY_TITLE = "Book.selectBooksByTitle"; ・ ・ ・ ``` 追記&修正です。 すみません、参考としたページの内容を転記&修正したソースとしたので、不足がありましたね。 NamedQueryは、Query(問合せ≒SQL)に名前をつけておくものとなります。 `name=`で指定するものはこの名前であり、文字列で指定します。 これはWorker02からも利用するので、public staticとして定義しておくとタイプミスがなくてよい、という記述の仕方です。