4

MyBatis v3 マッパー xml 内で where 句を動的に生成しています。ただし、括弧を配置するのは本当に面倒です。if ステートメントを使用せずに問題を処理する簡単な方法はありますか?

<where>
  <if test="filter != null">
    <choose>
      <when test="filter.lref != null">
        file.lref = #{filter.lref}
      </when>
      <otherwise>
        <!-- I don't want to use this -->
        <if test="filter.forLike != null || filter.forInt != null">
          ( 
        </if>
        <if test="filter.forLike != null" >
          subject LIKE #{filter.forLike}    
          OR requester_identifier LIKE #{filter.forLike}
          OR requester_name LIKE #{filter.forLike}
        </if>
        <if test="filter.forInt != null">
          OR file_id = #{filter.forInt}
        </if>

        <!-- I don't want to use this -->
        <if test="filter.forLike != null || filter.forInt != null">
          ) 
        </if>
      </otherwise>
    </choose>
  </if>
  <if test="listMode > 0">
    <choose>
       <when test="listMode == 1">
         AND file_status_link.dosya_ref is not NULL
       </when>
       <otherwise>
         AND file_status_link.dosya_ref is NULL
       </otherwise>
    </choose>
   </if>            
</where>

動的に生成された SQL 出力の例は次のとおりです。

WHERE ( subject LIKE ? OR requester_identifier LIKE ? OR requester_name LIKE ? ) 
AND file_status_link.dosya_ref is NULL 
4

2 に答える 2

5

<trim>その部分をタグ内にカプセル化することができます。次のようになります。

<trim prefix="(" prefixOverrides="OR" suffix=")">
  <if test="filter.forLike != null" >
    subject LIKE #{filter.forLike}    
    OR requester_identifier LIKE #{filter.forLike}
    OR requester_name LIKE #{filter.forLike}
  </if>
  <if test="filter.forInt != null">
    OR file_id = #{filter.forInt}
  </if>
</trim>
于 2013-01-13T20:46:38.817 に答える
0

疑似 SQL (XML-SQL):

where
    1 = 1
    <A>and file.lref = #{filter.lref}</A>
    <D>and (
        <E>
        subject like #{filter.forLike}    
        or requester_identifier like #{filter.forLike}
        or requester_name like #{filter.forLike}
        </E>
        <F>or file_id = #{filter.forInt}</F>
    )</D>
    </B>
    <C>and file_status_link.dosya_ref is <G>not</G> null</C>

どこ:

A: <B> && filter.lref != null
B: filter != null
D: <B> && (<E> || <F>)
E: filter.forLike != null
F: filter.forInt != null
C: listMode > 0
G: listMode == 1
于 2014-05-10T11:06:42.320 に答える