ai didi

java - MyBatis 解析具有多个语句的参数

转载 作者:行者123 更新时间:2023-12-02 09:28:12 24 4
gpt4 key购买 nike

我正在尝试使用 MyBatis 和 PostgreSQL 动态设置查询的锁定超时。

我的映射器看起来像:

 @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 在我的情况下不会匹配,因为我的参数锁定超时不是静态的。

有人知道如何动态设置参数锁定超时吗?

最佳答案

pgjdbc 似乎独立执行每个语句。
我不建议将多个语句放入单个映射器语句中,因为行为取决于驱动程序。
您应该声明两个方法并在同一 session /事务中调用它们。

@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'应该可以工作。

关于java - MyBatis 解析具有多个语句的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58185607/

24 4 0
文章推荐: java - 如何在 Jenkins 上的 Gradle 构建中过滤测试而无需提交?
文章推荐: powershell - $Array.IndexOf 对于带有前缀逗号的索引 0 是错误的
文章推荐: elasticsearch - 在 ElasticSearch 中聚合不同值
文章推荐: java - 在 Java 中,如何将一小段黑色文本拆分为 Arraylists?
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com