Передача нескольких аргументов в выбор без использования сложного объекта
Вопрос
Я пытаюсь пройти 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>
Решение
@Chin Я все равно опубликую то, что я напечатал с простым примером, хотя вы нашли то, что ищете. Мой пример с использованием 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>
Надеюсь это поможет.
Другие советы
Вы можете использовать встроенную карту параметра
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>
В Mybatis 3 вы можете использовать @Param
Аннотация в методе вашего класса Mapper (интерфейс):
public getSequenceIdByOrderNumber(@Param("seqId") int sequenceId,@Param("orderId") int orderNo);
Тогда вы можете использовать #{seqId}
, #{orderId}
в SQL без использования атрибута ParameterType.
не могу комментировать,
Нашел ответ, спасибо.
http://code.google.com/p/mybatis/wiki/howtoselectmultipleparams
Эта ссылка сломана, в настоящее время верна https://github.com/mybatis/mybatis-3/wiki/faq#how-do-use-multiple-parameters-in-a-mapper
Скопировать + вставку из этой вики
Java Reflection не дает способа узнать имя параметра метода, поэтому 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)
Используйте (добавьте @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)
Нашел ответ, спасибо.
http://code.google.com/p/mybatis/wiki/howtoselectmultipleparams