2

私は次のようなクエリマッパーを持っています:

<select id="searchSomething" parameterType="SomeType" resultType="SomeOtherType">
  select xxxxx
  from T_XXXX
  where 1=1
  <if test="propertyName == 'userName'">
    and USER_NAME = #{propertyValue}
  </if>
  <if test="propertyName == 'address'">
    and ADDRESS = #{propertyValue}
  </if>
  <if test="propertyName == 'taskDate'">
    and TASK_DATE = #{propertyValue}
  </if>
  <if test="propertyName == 'phone1'">
    and PHONE_1 = #{propertyValue}
  </if>
  <if test="propertyName == 'phone2'">
    and PHONE_2 = #{propertyValue}
  </if>
  ...
</select>

非常に多くのプロパティがあります。次のように、プロパティ名を列名に単純にマップするにはどうすればよいですか。

<select id="searchSomething" parameterType="SomeType" resultType="SomeOtherType">
  select xxxxx
  from T_XXXX
  where 1=1
    and 
    <propertyToColumn property="propertyName" />
      = #{propertyValue}
</select>

MyBatisに「propertyToColumn」のようなものはありますか?

iBatisで「insertColumnName」を見つけましたが、MyBatisから削除されていますか?

parameterTypeは、次のようなJavaクラスです。

public class SomeType{
  private String propertyName;
  private String propertyValue;
  ... getters and setters
}
4

2 に答える 2

2

これを行う1つの方法は、次を使用することです。

2つのArrayListを準備します。1つはpropertyNamesを使用し、もう1つはpropertValuesを使用します。それらが適切な順序になっていることを確認してください。つまり、propValuesList[i]にはpropNamesList[i]の値が必要です。

次に、HashMapに入れて、マップされたステートメントへの入力として渡します。

Map<String,Object> map = new HashMap<String,Object>();
List<String> propNamesList = new ArrayList<String>();
List<String> propValuesList = new ArrayList<String>();
propNamesList.add(0, "USER_NAME");
propNamesList.add(1, "ADDRESS");

propValuesList.add(0, "admin");
propValuesList.add(1, "hyderabad");

map.put("propNames",propNamesList);
map.put("propValues",propValuesList);

次に、マップされたステートメントで:

<select id="selectUsers" parameterType="hashmap" resultMap="UserResult">
    select * from users
    where 1 =1
    <if test="propNames != null and propValues != null">
       <foreach item="propName" index="index" collection="propNames">
        and #{propName} = #{propValues[${index}]}
       </foreach>
    </if>
 </select>

#{index }の代わりに${index}を使用していることに注意してください。

于 2013-01-28T05:40:17.027 に答える
1

コードで「parameter-column」変換を行い、結果の列をパラメーターとして渡す方がよいと思います。その場合、次のようなことができます。

<select id="searchSomething" parameterType="SomeType" resultType="SomeOtherType">
  select xxxxx
  from T_XXXX
  where 1=1
    and 
   ${propertyColumn} = #{propertyValue}
</select>

もちろん、VOにpropertyColumnを追加する必要があります。

于 2013-01-28T12:56:32.037 に答える