2017-05-15 16 views
2

私はmyBatisについて新しく、クエリの中にwhereステートメントを入れる必要があります。私のマッパーがこのように定義されてMyBatis:dinamic where条件

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>#{whereCondition}</where> 
</select> 

マイダオ:

public List<MyTalbe> findMyTableByWhereCondition(String whereCondition) { 
     Map<String, Object> param = new HashMap<String, Object>(); 
     param.put("whereCondition", "m.name = 'Test' and m.surname= 'Test'"); 
     return sqlSession.selectList("findMyTableByWhereCondition", param); 
    } 

このクエリを実行しようとすると、私は、 "無効な関係演算子" を得ます。この種の問合せを処理するベストプラクティスは何ですか?これは頻繁に変更される可能性があり、非常に複雑なものになる可能性があるため、「どこ」に置き換える必要があります。事前

+0

あなたの例の 'param'変数は使用されていません。あなたが 'sqlSession.selectList()'に渡す 'whereCondition'文字列は何ですか? –

+0

APIを正しく使用していないと思います。この質問の例を見てみましょう:[複雑なオブジェクトを使わずに複数の引数をSELECTに渡す](http://stackoverflow.com/questions/9308210/passing-multiple-arguments-into-a-select-without- WHERE条件でマップ要素ごとに1つのフィールド/値を使用する複合オブジェクトを使用します。 –

+0

@MickMnemonicしかし、私はすべての条件を置き換える必要があります – Skizzo

答えて

0

おかげパラメータwhereConditionを参照するために${...}を使用するようにしてください:

<select id="findMyTableByWhereCondition" parameterType="map" resultMap="mytable"> 
    SELECT * 
    FROM mytable m 
    <where>${whereCondition}</where> 
</select> 

文書は書きました:

をデフォルトでは、#{}構文を使用すると、MyBatisのが生成しますPreparedStatementプロパティを使用して、PreparedStatementパラメータ(例:?)に対して値を安全に設定します。これはより安全で、より高速でほとんど常に優先されますが、変更されていない文字列をSQL文に直接挿入したい場合もあります。たとえば、ORDER BYの場合、次のようなものを使用することがあります。
ORDER BY ${columnName}
ここで、MyBatisは文字列を変更またはエスケープしません。

注:使用$は、あなたがより良い公式ドキュメントからDynamic SQLを読んで、そのようなSQLを構築しようと思い、SQLインジェクション攻撃が発生します。