[英]MyBatis Resolving parameter with multiple statements
我正在嘗試使用 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
在我的情況下不匹配,因為我的參數鎖定超時不是 static。
有誰知道如何動態設置參數鎖定超時?
pgjdbc 似乎獨立執行每個語句。
我不建議將多個語句放在一個映射器語句中,因為行為取決於驅動程序。
您應該聲明兩個方法並在同一個會話/事務中調用它們。
@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()
。setLockTimeout("1s")
s
#{lockTimeout} || 's'
#{lockTimeout} || 's'
應該工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.