Передача нескольких аргументов в SELECT без использования сложного объекта - PullRequest
8 голосов
/ 16 февраля 2012

Я пытаюсь передать startSequenceId, stopSequenceId, orderNumber в карту SQL, однако я не хочу использовать типизированный объект, т.е. parameterType="com.abc.Order", могу ли я это сделать? *

<select id="getSequenceIdByOrderNumber" parameterType="?" resultType="int">
    select *
    from log
    where seq_id
    between #{startSequenceId} and #{stopSequenceId}
    and order_no = #{orderNumber}
    and rownum = 1
</select>

Ответы [ 5 ]

16 голосов
/ 24 мая 2013

Вы можете использовать встроенный параметр type 'map', например,

Map<String, Object> parms = new HashMap<String, Object>();
parms.put("name", "abc");
parms.put("phone", "123");
parms.put("email", "123@email.com");

List<Contact> list = myBatis.selectList("getContacts",parms);


<!-- in xml mapper -->
<select id="getContacts" parameterType="map" resultMap="Contact">
  SELECT * FROM CONTACT 
  WHERE CONTACT_NAME = ${name}
  AND CONTACT_PHONE = ${phone}
  AND CONTACT_MAIl = ${email}
</select>
7 голосов
/ 16 февраля 2012

@ Чин В любом случае я опубликую то, что набрал, на простом примере, хотя вы нашли то, что искали.Мой пример использования iBatis 2.3.4

<select id="retrieveTestXXX" parameterClass="java.util.Map" resultClass="java.lang.Integer">
    SELECT
    example_table.id
    FROM example_table
    WHERE example_table.xx_id = #testId# AND example_table.xx_id = #test2Id#
</select>

Надеюсь, это поможет.

6 голосов
/ 24 сентября 2014

В MyBatis 3 вы можете использовать @Param аннотацию в своем методе класса (интерфейса) mapper:

public getSequenceIdByOrderNumber(@Param("seqId") int sequenceId,@Param("orderId") int orderNo);

Тогда вы можете использовать #{seqId}, #{orderId} в SQL без использования атрибута parameterType.

0 голосов
/ 24 февраля 2017

не может комментировать,

Найден ответ, спасибо.

http://code.google.com/p/mybatis/wiki/HowToSelectMultipleParams

эта ссылка не работает, правильная на данный момент https://github.com/mybatis/mybatis-3/wiki/FAQ#how-do-i-use-multiple-parameters-in-a-mapper

копирование + вставка из этой вики

Отражение Java не предоставляет способа узнать имя параметра метода, поэтому MyBatis называет их по умолчанию, например: param1, param2 ..Если вы хотите дать им имя, используйте аннотацию @param следующим образом:

import org.apache.ibatis.annotations.Param;
public interface UserMapper {
   User selectUser(@Param("username") String username, @Param("hashedPassword") String hashedPassword);
}

Теперь вы можете использовать их в своем xml следующим образом:

<select id=”selectUser” resultType=”User”>
    select id, username, hashedPassword
    from some_table
    where username = #{username}
    and hashedPassword = #{hashedPassword}
</select>

tl; dr

когда вы объявляете метод в вашем интерфейсе вместо стандартной структуры Java

Type methodName (
    ParamType1 paramName1,
    ParamType2 paramName2,
    … ); (this is interface so no method body)

use (add @Param)

Type methodName (
    @Param("name1 available in xml") ParamType1 paramName1,
    @Param("name2 available in xml") ParamType2 paramName2,
    …); (this is still interface so no method body)
0 голосов
/ 16 февраля 2012
...