質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

Webアプリケーション 検索メソッドについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,699

Yoshi.E

score 7

前提・実現したいこと

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<BookEntity02> getData() {
        return em.createQuery("SELECT r FROM BookEntity02 r").getResultList();
    }

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2

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として定義しておくとタイプミスがなくてよい、という記述の仕方です。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/27 13:37

    回答ありがとございます!
    return em.createNamedQuery(Book02.SELECT_BY_TITLE)

    のBook02というものは何を表すものなのでしょうか?

    現在作成しているものは
    エンティティ→BookEntity02
    EJB→Worker02
    バッキングBean→BackingBook02

    です。
    かさねがさね申し訳ありありませんがどうぞよろしくお願いいたします。

    キャンセル

  • 2016/05/27 13:55 編集

    Book02の部分をBookEntity02にし、
    Worker02とBookEntity02にtakyafumin様が提示してくださったコードを実装しますと、
    SELECT_BY_TITLEに赤波線が入り、シンボルを見つけられませんと出ます。
    不勉強で申し訳ないのですが理由がわからないです。
    できることならtakyafumin様にプロジェクトを送って解析してもらいたいです。

    キャンセル

  • 2016/05/27 15:18

    上記への対応を回答に追記しました。

    キャンセル

  • 2016/05/27 15:34

    わああああ!今できました!!!!!!!
    感動です。思わずガッツポーズをしてしまいました!!
    まだまだ初心者ですが、takyafumin様のような人に教えることのできるプログラマーを目指し頑張ります。本当にありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る