MyBatis Resolving параметр с несколькими операторами - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь динамически установить время ожидания блокировки для запроса с MyBatis и PostgreSQL.

Мой Mapper выглядит так:

 @Select("SET LOCAL lock_timeout = '#{lockTimeout}s';"
   + "SELECT ......where id= #{myId} FOR UPDATE")
 MyObject select(@Param("lockTimeout") String lockTimeout, @Param("myId") String id);

Похоже, что есть несоответствие с параметрамии я получаю

 org.postgresql.util.PSQLException: Index of column out of range : 2, number of column 1.

@SelectProvider не будет соответствовать в моем случае, потому что мой таймаут блокировки параметров не является статическим.

У кого-нибудь есть идеи, как я могу динамически установить время ожидания блокировки параметра?

1 Ответ

1 голос
/ 02 октября 2019

pgjdbc, кажется, выполняет каждый оператор независимо.
Я бы не рекомендовал помещать несколько операторов в один оператор mapper, поскольку поведение зависит от драйвера.
Вы должны объявить два метода и вызвать их в одном сеансе /вместо транзакции.

@Update("select set_config('lock_timeout', #{lockTimeout}, true)")
void setLockTimeout(String lockTimeout);

@Select("SELECT ......where id= #{myId} FOR UPDATE")
MyObject select(@Param("myId") String id);

Несколько замечаний:

  • set_config() используется, поскольку SET LOCAL, похоже, не работает с PreparedStatement.
  • @Update используется для немедленного применения изменения. Если вы используете @Select, вам может потребоваться явно вызвать SqlSession#commit().
  • В отличие от вашего примера, параметр должен включать s т.е. setLockTimeout("1s").
    Если вы предпочитаете передавать только число,#{lockTimeout} || 's' должно работать.
...