QA@IT
«質問へ戻る

improve syntax

5599
本文
 
 servletの一部分です。 
 
+```java
 // 一覧/検索画面の検索を押した際の処理  
 }else if("serch".equals(serch)){  
 
 
     //遷移先を一覧/検索画面にする  
     address = LIST_ADDRESS; 
+```
 
 
 
 ③DAOでDBに格納してあるデータを取り出します。select処理です。 
 
+```java
 /**  
 * ジャンル名による絞り込みの結果を取得するメソッド  
 * 現在はあいまい検索による結果を取得するメソッド  
     return list;  
 
 } 
+```
 
 以上が全体的なざっくりとした流れになります。検索はSQLがDBに登録してあるデータに対して行うので、 肝はSERCHNAME_QUERYの部分だと思うのです。以降が質問内容となります。 
 
 あいまい検索というものがよく分かっていなかったので、一度SQLPlus内で 
 
-select name from item(テーブル名です) where name like '%ク%' order by id;と実行すると、 
+`select name from item(テーブル名です) where name like '%ク%' order by id;`と実行すると、 
 
 ダークソウル 
 ジュラシック・パーク 
 
 と表示されたので、これを元にSQL文を作成してみました 
 
+```java
 package servlet;  
 
 /**  
 
 } 
 
+```
 DAO内の⑥の記述をps_.setString(1,"%" + genreSerch + "%"); 
 
 
 紐付けた上で全体の情報をSELECT処理により表示していました。 
 
 
+```java
 CREATE TABLE GENRE( 
 ID    NUMBER(2), 
 NAME    VARCHAR(20) NOT NULL, 
 Primary Key(ID), 
 FOREIGN Key(GENRE_ID) REFERENCES GENRE(ID) 
 ); 
+```
 
 テーブルITEMの外部キーがテーブルGENREのIDとなります。 
 
 最初は既に情報が登録されているテーブルITEMのNAMEにのみ検索を掛けて、条件にあったものを持って来ればよい、と 考えていましたが、ジャンルを登録した後の、全ての情報取得は以下のSQLで実行していました。 
 
+```java
 //書籍情報をselect処理により取得するSQL文 
 public static final String SELECTBOOK_QUERY = 
 
 "SELECT TO_NUMBER(ni.ID) ID,ng.NAME GENRE,ni.NAME BOOK,TO_CHAR(ni.SALE_DATE,'yyyy/mm/dd') SALE_DATE,ni.FAVORITE FAVORITE,ni.STOCK STOCK,ni.COM COM" + 
 "FROM ITEM ni,GENRE ng WHERE ni.GENRE_ID = ng.ID ORDER BY ni.ID "; 
 
+```
 両方のテーブルを結合し、登録されているジャンルとテーブルITEMの内容を、テーブルITEMのID順に並べるという処理内容です。 
 
 なので、上記のSQLのように「ジャンルが登録されているテーブルとジャンルを含めた全情報が登録されているテーブルを紐付けた後に」先ほどのあいまい検索のSQLをどこかで設定してやる必要があるのでは?と考え直しました。これで正解かどうかは分からないのですが。

DAOからDBへアクセスする方法について

DAOによるDBへのアクセス方法についての質問です。

開発環境は、

OS:Windows7
ブラウザ:IE
eclipce:3.6
Tomcat:7.0
DB:Oracle11g・SQLPlus

となります。

添付画像の一覧画面にて表示されている情報は、DBに登録してあるものとなっています。
ここにて存在してある検索テキストボックスにて「あいまい検索を行いたい」というのが今回の流れです。

例えば、「ク」と入力すれば、ダークソウルとジュラシック・パーク、この2つが表示されるように、
前後での検索一致を盛り込みたいと考えています。

画面はjspで作成しています。

①検索テキストボックスにて値を受け取ります。「ク」と入力され、
検索ボタンが押されたとします。

servletの一部分です。

// 一覧/検索画面の検索を押した際の処理  
}else if("serch".equals(serch)){  

    // 「ク」を受け取ります 
    String serchWord = request.getParameter("serchWord");  

    // ②受け取った「ク」と接続オブジェクトを引数に渡します。DAOに飛びます 
    List<BookBean>list_ = bd.selectOrSerch(con_,serchWord);  

    // ⑤ DAOにて「ク」が含まれるDB内の全情報を取得 
    request.setAttribute("BOOK_LIST",list_);  

    //遷移先を一覧/検索画面にする  
    address = LIST_ADDRESS; 

③DAOでDBに格納してあるデータを取り出します。select処理です。

/**  
* ジャンル名による絞り込みの結果を取得するメソッド  
* 現在はあいまい検索による結果を取得するメソッド  
* @param con 接続オブジェクト  
* @return genreSerch クライアントの全入力情報  
**/  
public List<BookBean> selectOrSerch(Connection con,String genreSerch) throws Exception{  

    List<BookBean> list = new ArrayList<BookBean>();  

    // 現在は使用していないインスタンスです 
    CharOperator co = new CharOperator();  

    try{  

        //ジャンル検索で全てを選択または一覧検索画面に遷移した場合  
        if("all".equals(genreSerch)){  

            ps_ = con.prepareStatement(SELECTBOOK_QUERY);  



        }  

        /**  
         * 上の記述は関係ありません。 
         * あいまい検索を行った場合  
         */  
        else{  

            /** 
             * プリペアーステートメントにSQL文をセット。SERCHNAME_QUERYの内容はは次に記述します 
             * SERCHNAME_QUERYはstaticインポートにより直接使用しています 
             */ 
            ps_ = con.prepareStatement(SERCHNAME_QUERY);  

            // 「ク」をバインドします 
            ps_.setString(1,genreSerch); // ⑥

        }  

        // SQL文の発行 
        rs_ = ps_.executeQuery();  

        // レコードの最終行になるまで 
        while(rs_.next()){  

            BookBean bb = new BookBean();  

            //レコード1件分のデータをBeanに格納する  
            bb.setId(rs_.getInt("ID"));  
            bb.setGenre(rs_.getString("GENRE"));  
            bb.setName(rs_.getString("BOOK"));  
            bb.setReleaseDay(rs_.getString("SALE_DATE"));  
            bb.setPopularity(rs_.getInt("FAVORITE"));  
            bb.setStock(rs_.getString("STOCK"));  
            bb.setComment(rs_.getString("COM"));  

            //Beanに格納した1件のレコードをListへ追加する  
            list.add(bb);  

        }  

    }catch(Exception e){  
        throw e;  

    }finally{  

        try{  

            // クローズ処理 
            if(rs_ != null)    rs_.close();  
            if(ps_ != null)    ps_.close();  

        }catch (SQLException e){  
             throw e;  
        }  

    }  

    //全入力情報を返す ④servletに戻ります 
    return list;  

} 

以上が全体的なざっくりとした流れになります。検索はSQLがDBに登録してあるデータに対して行うので、 肝はSERCHNAME_QUERYの部分だと思うのです。以降が質問内容となります。

あいまい検索というものがよく分かっていなかったので、一度SQLPlus内で

select name from item(テーブル名です) where name like '%ク%' order by id;と実行すると、

ダークソウル
ジュラシック・パーク

と表示されたので、これを元にSQL文を作成してみました

package servlet;  

/**  
* サーブレットで用いる定数クラス  
**/  

public interface Constants {  

    /**  
     * あいまい検索を行うSQL文  
     */  
    public static final String SERCHNAME_QUERY = "SELECT NAME FROM ITEM WHERE NAME LIKE ? ORDER BY ID"

} 

DAO内の⑥の記述をps_.setString(1,"%" + genreSerch + "%");

としてみたのですが、「行検索が無効」というエラーが出てしまいます。
情報が入っているDBに対しての検索なのでこれでいいのでは?と思っていたのですが、
あいまい検索を掛けるテーブルはITEMですが、もう1つGENREというテーブルがあり、この2つを
紐付けた上で全体の情報をSELECT処理により表示していました。

CREATE TABLE GENRE( 
ID    NUMBER(2), 
NAME    VARCHAR(20) NOT NULL, 
Primary Key(ID) 
); 

CREATE TABLE ITEM( 
ID    NUMBER(5), 
GENRE_ID    NUMBER(2), 
NAME    VARCHAR(50) NOT NULL, 
SALE_DATE    DATE NOT NULL, 
FAVORITE    NUMBER(1) NOT NULL, 
STORK    CHAR(1) NOT NULL, 
COM    VARCHAR(200), 
Primary Key(ID), 
FOREIGN Key(GENRE_ID) REFERENCES GENRE(ID) 
); 

テーブルITEMの外部キーがテーブルGENREのIDとなります。

最初は既に情報が登録されているテーブルITEMのNAMEにのみ検索を掛けて、条件にあったものを持って来ればよい、と 考えていましたが、ジャンルを登録した後の、全ての情報取得は以下のSQLで実行していました。

//書籍情報をselect処理により取得するSQL文 
public static final String SELECTBOOK_QUERY = 

"SELECT TO_NUMBER(ni.ID) ID,ng.NAME GENRE,ni.NAME BOOK,TO_CHAR(ni.SALE_DATE,'yyyy/mm/dd') SALE_DATE,ni.FAVORITE FAVORITE,ni.STOCK STOCK,ni.COM COM" + 
"FROM ITEM ni,GENRE ng WHERE ni.GENRE_ID = ng.ID ORDER BY ni.ID "; 

両方のテーブルを結合し、登録されているジャンルとテーブルITEMの内容を、テーブルITEMのID順に並べるという処理内容です。

なので、上記のSQLのように「ジャンルが登録されているテーブルとジャンルを含めた全情報が登録されているテーブルを紐付けた後に」先ほどのあいまい検索のSQLをどこかで設定してやる必要があるのでは?と考え直しました。これで正解かどうかは分からないのですが。

なので質問としては、上記のSELECT文を元にしたあいまい検索の追加記述の方法を、どなたか教えていただけないでしょうか?どうぞよろしくお願い致します。

DAOによるDBへのアクセス方法についての質問です。 

開発環境は、 

OS:Windows7 
ブラウザ:IE 
eclipce:3.6 
Tomcat:7.0 
DB:Oracle11g・SQLPlus 

となります。 

添付画像の一覧画面にて表示されている情報は、DBに登録してあるものとなっています。 
ここにて存在してある検索テキストボックスにて「あいまい検索を行いたい」というのが今回の流れです。 

例えば、「ク」と入力すれば、ダークソウルとジュラシック・パーク、この2つが表示されるように、 
前後での検索一致を盛り込みたいと考えています。 

画面はjspで作成しています。 

①検索テキストボックスにて値を受け取ります。「ク」と入力され、 
検索ボタンが押されたとします。 


servletの一部分です。 

```java
// 一覧/検索画面の検索を押した際の処理  
}else if("serch".equals(serch)){  

    // 「ク」を受け取ります 
    String serchWord = request.getParameter("serchWord");  

    // ②受け取った「ク」と接続オブジェクトを引数に渡します。DAOに飛びます 
    List<BookBean>list_ = bd.selectOrSerch(con_,serchWord);  

    // ⑤ DAOにて「ク」が含まれるDB内の全情報を取得 
    request.setAttribute("BOOK_LIST",list_);  

    //遷移先を一覧/検索画面にする  
    address = LIST_ADDRESS; 
```



③DAOでDBに格納してあるデータを取り出します。select処理です。 

```java
/**  
* ジャンル名による絞り込みの結果を取得するメソッド  
* 現在はあいまい検索による結果を取得するメソッド  
* @param con 接続オブジェクト  
* @return genreSerch クライアントの全入力情報  
**/  
public List<BookBean> selectOrSerch(Connection con,String genreSerch) throws Exception{  

    List<BookBean> list = new ArrayList<BookBean>();  

    // 現在は使用していないインスタンスです 
    CharOperator co = new CharOperator();  

    try{  

        //ジャンル検索で全てを選択または一覧検索画面に遷移した場合  
        if("all".equals(genreSerch)){  

            ps_ = con.prepareStatement(SELECTBOOK_QUERY);  



        }  

        /**  
         * 上の記述は関係ありません。 
         * あいまい検索を行った場合  
         */  
        else{  
             
            /** 
             * プリペアーステートメントにSQL文をセット。SERCHNAME_QUERYの内容はは次に記述します 
             * SERCHNAME_QUERYはstaticインポートにより直接使用しています 
             */ 
            ps_ = con.prepareStatement(SERCHNAME_QUERY);  
             
            // 「ク」をバインドします 
            ps_.setString(1,genreSerch); // ⑥

        }  

        // SQL文の発行 
        rs_ = ps_.executeQuery();  

        // レコードの最終行になるまで 
        while(rs_.next()){  

            BookBean bb = new BookBean();  

            //レコード1件分のデータをBeanに格納する  
            bb.setId(rs_.getInt("ID"));  
            bb.setGenre(rs_.getString("GENRE"));  
            bb.setName(rs_.getString("BOOK"));  
            bb.setReleaseDay(rs_.getString("SALE_DATE"));  
            bb.setPopularity(rs_.getInt("FAVORITE"));  
            bb.setStock(rs_.getString("STOCK"));  
            bb.setComment(rs_.getString("COM"));  

            //Beanに格納した1件のレコードをListへ追加する  
            list.add(bb);  

        }  

    }catch(Exception e){  
        throw e;  

    }finally{  

        try{  

            // クローズ処理 
            if(rs_ != null)    rs_.close();  
            if(ps_ != null)    ps_.close();  

        }catch (SQLException e){  
             throw e;  
        }  

    }  

    //全入力情報を返す ④servletに戻ります 
    return list;  

} 
```

以上が全体的なざっくりとした流れになります。検索はSQLがDBに登録してあるデータに対して行うので、 肝はSERCHNAME_QUERYの部分だと思うのです。以降が質問内容となります。 

あいまい検索というものがよく分かっていなかったので、一度SQLPlus内で 

`select name from item(テーブル名です) where name like '%ク%' order by id;`と実行すると、 

ダークソウル 
ジュラシック・パーク 

と表示されたので、これを元にSQL文を作成してみました 

```java
package servlet;  

/**  
* サーブレットで用いる定数クラス  
**/  

public interface Constants {  

    /**  
     * あいまい検索を行うSQL文  
     */  
    public static final String SERCHNAME_QUERY = "SELECT NAME FROM ITEM WHERE NAME LIKE ? ORDER BY ID"

} 

```
DAO内の⑥の記述をps_.setString(1,"%" + genreSerch + "%"); 


としてみたのですが、「行検索が無効」というエラーが出てしまいます。
情報が入っているDBに対しての検索なのでこれでいいのでは?と思っていたのですが、
あいまい検索を掛けるテーブルはITEMですが、もう1つGENREというテーブルがあり、この2つを 
紐付けた上で全体の情報をSELECT処理により表示していました。 


```java
CREATE TABLE GENRE( 
ID    NUMBER(2), 
NAME    VARCHAR(20) NOT NULL, 
Primary Key(ID) 
); 

CREATE TABLE ITEM( 
ID    NUMBER(5), 
GENRE_ID    NUMBER(2), 
NAME    VARCHAR(50) NOT NULL, 
SALE_DATE    DATE NOT NULL, 
FAVORITE    NUMBER(1) NOT NULL, 
STORK    CHAR(1) NOT NULL, 
COM    VARCHAR(200), 
Primary Key(ID), 
FOREIGN Key(GENRE_ID) REFERENCES GENRE(ID) 
); 
```

テーブルITEMの外部キーがテーブルGENREのIDとなります。 

最初は既に情報が登録されているテーブルITEMのNAMEにのみ検索を掛けて、条件にあったものを持って来ればよい、と 考えていましたが、ジャンルを登録した後の、全ての情報取得は以下のSQLで実行していました。 

```java
//書籍情報をselect処理により取得するSQL文 
public static final String SELECTBOOK_QUERY = 

"SELECT TO_NUMBER(ni.ID) ID,ng.NAME GENRE,ni.NAME BOOK,TO_CHAR(ni.SALE_DATE,'yyyy/mm/dd') SALE_DATE,ni.FAVORITE FAVORITE,ni.STOCK STOCK,ni.COM COM" + 
"FROM ITEM ni,GENRE ng WHERE ni.GENRE_ID = ng.ID ORDER BY ni.ID "; 

```
両方のテーブルを結合し、登録されているジャンルとテーブルITEMの内容を、テーブルITEMのID順に並べるという処理内容です。 

なので、上記のSQLのように「ジャンルが登録されているテーブルとジャンルを含めた全情報が登録されているテーブルを紐付けた後に」先ほどのあいまい検索のSQLをどこかで設定してやる必要があるのでは?と考え直しました。これで正解かどうかは分からないのですが。

なので質問としては、上記のSELECT文を元にしたあいまい検索の追加記述の方法を、どなたか教えていただけないでしょうか?どうぞよろしくお願い致します。

質問を投稿

DAOからDBへアクセスする方法について

DAOによるDBへのアクセス方法についての質問です。

開発環境は、

OS:Windows7
ブラウザ:IE
eclipce:3.6
Tomcat:7.0
DB:Oracle11g・SQLPlus

となります。

添付画像の一覧画面にて表示されている情報は、DBに登録してあるものとなっています。
ここにて存在してある検索テキストボックスにて「あいまい検索を行いたい」というのが今回の流れです。

例えば、「ク」と入力すれば、ダークソウルとジュラシック・パーク、この2つが表示されるように、
前後での検索一致を盛り込みたいと考えています。

画面はjspで作成しています。

①検索テキストボックスにて値を受け取ります。「ク」と入力され、
検索ボタンが押されたとします。

servletの一部分です。

// 一覧/検索画面の検索を押した際の処理

}else if("serch".equals(serch)){

// 「ク」を受け取ります 
String serchWord = request.getParameter("serchWord");  

// ②受け取った「ク」と接続オブジェクトを引数に渡します。DAOに飛びます 
List<BookBean>list_ = bd.selectOrSerch(con_,serchWord);  

// ⑤ DAOにて「ク」が含まれるDB内の全情報を取得 
request.setAttribute("BOOK_LIST",list_);  

//遷移先を一覧/検索画面にする  
address = LIST_ADDRESS; 

③DAOでDBに格納してあるデータを取り出します。select処理です。

/**

  • ジャンル名による絞り込みの結果を取得するメソッド
  • 現在はあいまい検索による結果を取得するメソッド
  • @param con 接続オブジェクト
  • @return genreSerch クライアントの全入力情報

    **/

    public List selectOrSerch(Connection con,String genreSerch) throws Exception{

    List list = new ArrayList();

    // 現在は使用していないインスタンスです
    CharOperator co = new CharOperator();

    try{

    //ジャンル検索で全てを選択または一覧検索画面に遷移した場合  
    if("all".equals(genreSerch)){  
    
        ps_ = con.prepareStatement(SELECTBOOK_QUERY);  
    
    }  
    
    /**  
     * 上の記述は関係ありません。 
     * あいまい検索を行った場合  
     */  
    else{  
    
        /** 
         * プリペアーステートメントにSQL文をセット。SERCHNAME_QUERYの内容はは次に記述します 
         * SERCHNAME_QUERYはstaticインポートにより直接使用しています 
         */ 
        ps_ = con.prepareStatement(SERCHNAME_QUERY);  
    
        // 「ク」をバインドします 
        ps_.setString(1,genreSerch); // ⑥
    
    }  
    
    // SQL文の発行 
    rs_ = ps_.executeQuery();  
    
    // レコードの最終行になるまで 
    while(rs_.next()){  
    
        BookBean bb = new BookBean();  
    
        //レコード1件分のデータをBeanに格納する  
        bb.setId(rs_.getInt("ID"));  
        bb.setGenre(rs_.getString("GENRE"));  
        bb.setName(rs_.getString("BOOK"));  
        bb.setReleaseDay(rs_.getString("SALE_DATE"));  
        bb.setPopularity(rs_.getInt("FAVORITE"));  
        bb.setStock(rs_.getString("STOCK"));  
        bb.setComment(rs_.getString("COM"));  
    
        //Beanに格納した1件のレコードをListへ追加する  
        list.add(bb);  
    
    }  
    

    }catch(Exception e){

    throw e;

    }finally{

    try{  
    
        // クローズ処理 
        if(rs_ != null)    rs_.close();  
        if(ps_ != null)    ps_.close();  
    
    }catch (SQLException e){  
         throw e;  
    }  
    

    }

    //全入力情報を返す ④servletに戻ります
    return list;

}

以上が全体的なざっくりとした流れになります。検索はSQLがDBに登録してあるデータに対して行うので、 肝はSERCHNAME_QUERYの部分だと思うのです。以降が質問内容となります。

あいまい検索というものがよく分かっていなかったので、一度SQLPlus内で

select name from item(テーブル名です) where name like '%ク%' order by id;と実行すると、

ダークソウル
ジュラシック・パーク

と表示されたので、これを元にSQL文を作成してみました

package servlet;

/**

  • サーブレットで用いる定数クラス
    **/

public interface Constants {

/**  
 * あいまい検索を行うSQL文  
 */  
public static final String SERCHNAME_QUERY = "SELECT NAME FROM ITEM WHERE NAME LIKE ? ORDER BY ID"

}

DAO内の⑥の記述をps_.setString(1,"%" + genreSerch + "%");

としてみたのですが、「行検索が無効」というエラーが出てしまいます。
情報が入っているDBに対しての検索なのでこれでいいのでは?と思っていたのですが、
あいまい検索を掛けるテーブルはITEMですが、もう1つGENREというテーブルがあり、この2つを
紐付けた上で全体の情報をSELECT処理により表示していました。

CREATE TABLE GENRE(
ID NUMBER(2),
NAME VARCHAR(20) NOT NULL,
Primary Key(ID)
);

CREATE TABLE ITEM(
ID NUMBER(5),
GENRE_ID NUMBER(2),
NAME VARCHAR(50) NOT NULL,
SALE_DATE DATE NOT NULL,
FAVORITE NUMBER(1) NOT NULL,
STORK CHAR(1) NOT NULL,
COM VARCHAR(200),
Primary Key(ID),
FOREIGN Key(GENRE_ID) REFERENCES GENRE(ID)
);

テーブルITEMの外部キーがテーブルGENREのIDとなります。

最初は既に情報が登録されているテーブルITEMのNAMEにのみ検索を掛けて、条件にあったものを持って来ればよい、と 考えていましたが、ジャンルを登録した後の、全ての情報取得は以下のSQLで実行していました。

//書籍情報をselect処理により取得するSQL文
public static final String SELECTBOOK_QUERY =

"SELECT TO_NUMBER(ni.ID) ID,ng.NAME GENRE,ni.NAME BOOK,TO_CHAR(ni.SALE_DATE,'yyyy/mm/dd') SALE_DATE,ni.FAVORITE FAVORITE,ni.STOCK STOCK,ni.COM COM" +
"FROM ITEM ni,GENRE ng WHERE ni.GENRE_ID = ng.ID ORDER BY ni.ID ";

両方のテーブルを結合し、登録されているジャンルとテーブルITEMの内容を、テーブルITEMのID順に並べるという処理内容です。

なので、上記のSQLのように「ジャンルが登録されているテーブルとジャンルを含めた全情報が登録されているテーブルを紐付けた後に」先ほどのあいまい検索のSQLをどこかで設定してやる必要があるのでは?と考え直しました。これで正解かどうかは分からないのですが。

なので質問としては、上記のSELECT文を元にしたあいまい検索の追加記述の方法を、どなたか教えていただけないでしょうか?どうぞよろしくお願い致します。

DAOによるDBへのアクセス方法についての質問です。 

開発環境は、 

OS:Windows7 
ブラウザ:IE 
eclipce:3.6 
Tomcat:7.0 
DB:Oracle11g・SQLPlus 

となります。 

添付画像の一覧画面にて表示されている情報は、DBに登録してあるものとなっています。 
ここにて存在してある検索テキストボックスにて「あいまい検索を行いたい」というのが今回の流れです。 

例えば、「ク」と入力すれば、ダークソウルとジュラシック・パーク、この2つが表示されるように、 
前後での検索一致を盛り込みたいと考えています。 

画面はjspで作成しています。 

①検索テキストボックスにて値を受け取ります。「ク」と入力され、 
検索ボタンが押されたとします。 


servletの一部分です。 

// 一覧/検索画面の検索を押した際の処理  
}else if("serch".equals(serch)){  

    // 「ク」を受け取ります 
    String serchWord = request.getParameter("serchWord");  

    // ②受け取った「ク」と接続オブジェクトを引数に渡します。DAOに飛びます 
    List<BookBean>list_ = bd.selectOrSerch(con_,serchWord);  

    // ⑤ DAOにて「ク」が含まれるDB内の全情報を取得 
    request.setAttribute("BOOK_LIST",list_);  

    //遷移先を一覧/検索画面にする  
    address = LIST_ADDRESS; 



③DAOでDBに格納してあるデータを取り出します。select処理です。 

/**  
* ジャンル名による絞り込みの結果を取得するメソッド  
* 現在はあいまい検索による結果を取得するメソッド  
* @param con 接続オブジェクト  
* @return genreSerch クライアントの全入力情報  
**/  
public List<BookBean> selectOrSerch(Connection con,String genreSerch) throws Exception{  

    List<BookBean> list = new ArrayList<BookBean>();  

    // 現在は使用していないインスタンスです 
    CharOperator co = new CharOperator();  

    try{  

        //ジャンル検索で全てを選択または一覧検索画面に遷移した場合  
        if("all".equals(genreSerch)){  

            ps_ = con.prepareStatement(SELECTBOOK_QUERY);  



        }  

        /**  
         * 上の記述は関係ありません。 
         * あいまい検索を行った場合  
         */  
        else{  
             
            /** 
             * プリペアーステートメントにSQL文をセット。SERCHNAME_QUERYの内容はは次に記述します 
             * SERCHNAME_QUERYはstaticインポートにより直接使用しています 
             */ 
            ps_ = con.prepareStatement(SERCHNAME_QUERY);  
             
            // 「ク」をバインドします 
            ps_.setString(1,genreSerch); // ⑥

        }  

        // SQL文の発行 
        rs_ = ps_.executeQuery();  

        // レコードの最終行になるまで 
        while(rs_.next()){  

            BookBean bb = new BookBean();  

            //レコード1件分のデータをBeanに格納する  
            bb.setId(rs_.getInt("ID"));  
            bb.setGenre(rs_.getString("GENRE"));  
            bb.setName(rs_.getString("BOOK"));  
            bb.setReleaseDay(rs_.getString("SALE_DATE"));  
            bb.setPopularity(rs_.getInt("FAVORITE"));  
            bb.setStock(rs_.getString("STOCK"));  
            bb.setComment(rs_.getString("COM"));  

            //Beanに格納した1件のレコードをListへ追加する  
            list.add(bb);  

        }  

    }catch(Exception e){  
        throw e;  

    }finally{  

        try{  

            // クローズ処理 
            if(rs_ != null)    rs_.close();  
            if(ps_ != null)    ps_.close();  

        }catch (SQLException e){  
             throw e;  
        }  

    }  

    //全入力情報を返す ④servletに戻ります 
    return list;  

} 

以上が全体的なざっくりとした流れになります。検索はSQLがDBに登録してあるデータに対して行うので、 肝はSERCHNAME_QUERYの部分だと思うのです。以降が質問内容となります。 

あいまい検索というものがよく分かっていなかったので、一度SQLPlus内で 

select name from item(テーブル名です) where name like '%ク%' order by id;と実行すると、 

ダークソウル 
ジュラシック・パーク 

と表示されたので、これを元にSQL文を作成してみました 

package servlet;  

/**  
* サーブレットで用いる定数クラス  
**/  

public interface Constants {  

    /**  
     * あいまい検索を行うSQL文  
     */  
    public static final String SERCHNAME_QUERY = "SELECT NAME FROM ITEM WHERE NAME LIKE ? ORDER BY ID"

} 

DAO内の⑥の記述をps_.setString(1,"%" + genreSerch + "%"); 


としてみたのですが、「行検索が無効」というエラーが出てしまいます。
情報が入っているDBに対しての検索なのでこれでいいのでは?と思っていたのですが、
あいまい検索を掛けるテーブルはITEMですが、もう1つGENREというテーブルがあり、この2つを 
紐付けた上で全体の情報をSELECT処理により表示していました。 


CREATE TABLE GENRE( 
ID    NUMBER(2), 
NAME    VARCHAR(20) NOT NULL, 
Primary Key(ID) 
); 

CREATE TABLE ITEM( 
ID    NUMBER(5), 
GENRE_ID    NUMBER(2), 
NAME    VARCHAR(50) NOT NULL, 
SALE_DATE    DATE NOT NULL, 
FAVORITE    NUMBER(1) NOT NULL, 
STORK    CHAR(1) NOT NULL, 
COM    VARCHAR(200), 
Primary Key(ID), 
FOREIGN Key(GENRE_ID) REFERENCES GENRE(ID) 
); 

テーブルITEMの外部キーがテーブルGENREのIDとなります。 

最初は既に情報が登録されているテーブルITEMのNAMEにのみ検索を掛けて、条件にあったものを持って来ればよい、と 考えていましたが、ジャンルを登録した後の、全ての情報取得は以下のSQLで実行していました。 

//書籍情報をselect処理により取得するSQL文 
public static final String SELECTBOOK_QUERY = 

"SELECT TO_NUMBER(ni.ID) ID,ng.NAME GENRE,ni.NAME BOOK,TO_CHAR(ni.SALE_DATE,'yyyy/mm/dd') SALE_DATE,ni.FAVORITE FAVORITE,ni.STOCK STOCK,ni.COM COM" + 
"FROM ITEM ni,GENRE ng WHERE ni.GENRE_ID = ng.ID ORDER BY ni.ID "; 

両方のテーブルを結合し、登録されているジャンルとテーブルITEMの内容を、テーブルITEMのID順に並べるという処理内容です。 

なので、上記のSQLのように「ジャンルが登録されているテーブルとジャンルを含めた全情報が登録されているテーブルを紐付けた後に」先ほどのあいまい検索のSQLをどこかで設定してやる必要があるのでは?と考え直しました。これで正解かどうかは分からないのですが。

なので質問としては、上記のSELECT文を元にしたあいまい検索の追加記述の方法を、どなたか教えていただけないでしょうか?どうぞよろしくお願い致します。