3

だから私のプログラムでは:

    private static final String GET_USERS_BY_PARAMS = "select * from user t "
        + "where t.id like %?% "
        + "AND t.name LIKE %?% "
        + "AND t.location LIKE %?% " 
        + "AND t.telephone LIKE %?% ";

上記のすべてのパラメータは、varcharとしてデータベースに保存されます。

しかし、私が以下を実行すると:

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS);
            statement.setString(1, userID);
            statement.setString(2, name);
            statement.setString(3, location);
            statement.setString(4, telephone());

            rs = statement.executeQuery();

無効な文字があったことを示すSQL例外が発生します。アプリケーションはexecuteQueryでエラーをスローするため、パラメーターの設定は問題になりません。正確なユーザーIDや名前などを入力しなくても検索できるように、%記号を使用することになったのではないかと思いました。

事前に助けてくれてありがとう!

4

3 に答える 3

4

ワイルドカードは、準備されたステートメントに渡される値の一部である必要があります。したがって、次のようなものが必要です。

private static final String GET_USERS_BY_PARAMS = "select * from user t "
    + "where t.id like ? "
    + "AND t.name LIKE ? "
    + "AND t.location LIKE ? " 
    + "AND t.telephone LIKE ? ";

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS);
statement.setString(1, "%" + userID + "%");
statement.setString(2, "%" + name + "%");
statement.setString(3, "%" + location + "%");
statement.setString(4, "%" + telephone() + "%");

ところで:データ型はuser.id何ですか?

それが数値の場合、LIKE は正しく機能しません。代わりに、ID を明示的に文字値にキャストする必要があります。where to_char(t.id) like ?

于 2012-11-16T13:50:55.387 に答える
2

連結演算子で書くことができます

LIKE ('%' || ? || '%')
于 2012-11-16T13:52:07.970 に答える
2

関数を使用CONCATすると、次のように機能します。LIKE CONCAT('%', ?, '%')
または、使用することもできますLIKE ('%' || ? || '%')

于 2012-11-16T13:51:41.173 に答える