Передача параметра в MyBatis @Select

Я пишу свое первое приложение MyBatis и застрял вокруг @Select. Я не знаю, в чем проблема с моим определением @Select, все выглядит нормально, но я получил Parameter not found исключение.

Я следовал той же схеме, когда передавал параметры своему оператору @Insert, и он работает без проблем.

Я использую MyBatis 3.4.2.

Это мой @Select:

@Select("SELECT * "
        + "FROM configuration "
        + "WHERE key_name = #{key} AND "
        +       "(#{userId} IS NULL AND user_id IS NULL) OR user_id = #{userId} AND "
        +       "status = 1")
Configuration findByKeyAndUserId(String key, Long userId);

Исключение, которое я получил:

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.binding.BindingException: Parameter 'key' not found. Available parameters are [arg1, arg0, param1, param2]
### Cause: org.apache.ibatis.binding.BindingException: Parameter 'key' not found. Available parameters are [arg1, arg0, param1, param2]

2 ответа

Решение

Когда вы передаете объект с одним параметром, доступ к свойствам осуществляется напрямую через метод получения или ключ, заданный для карты. Если вы хотите передать несколько параметров в методе, вы должны назвать параметры с аннотацией:

Configuration findByKeyAndUserId(@Param("key") String key, @Param("userId") Long userId);

Этот синтаксис, основанный на аннотациях, фактически ведет себя как карта ключ-значение. Ключи предоставляются @Param. Имя, которое вы выбираете для переменных параметров, не отображается.

Пожалуйста, попробуй -parameters опция компиляции предоставляется начиная с JDK 8. Вы можете опустить @Param аннотаций.

См. https://github.com/mybatis/mybatis-3/issues/549

Благодарю.

Другие вопросы по тегам