当我使用参数Param<LocalDateTime>
运行查询时,直接使用SQLServer2012Templates一切正常。
[DEBUG] [||] com.querydsl.sql。显示生成的查询'?',但据我所知,它不是发送给SQL Server的查询。
当同样的查询通过QuerydslR2dbcRepository运行时,我得到异常:
o.r2dbc.mssql。ExceptionFactory$ mssqlbadgramareexception: [102] [S0001]语法错误,接近'?'
依赖性:
实现org.springframework。数据:spring-data-r2dbc
实现io。r2dbc: r2dbc-mssql">
实现"com.infobip: infobip-spring-data-r2dbc-querydsl-boot-starter: 7.0.0
如何解决这个问题?
R2DBC规范团队明确决定不遵循绑定参数占位符的JDBC语法,请参阅我在邮件列表中提出的讨论。这意味着所有基于JDBC的库要么:
- 必须显式支持R2DBC,并自己实现特定于供应商的每个驱动程序语法
- 不支持R2DBC绑定变量(当然内联值仍然是可能的)
从我发现的(并在上述邮件列表中记录)来看,语法至少是:
-- Oracle and others
SELECT * FROM t WHERE id = :1
SELECT * FROM t WHERE id = :name
-- SQL Server
SELECT * FROM t WHERE id = @name
-- PostgreSQL
SELECT * FROM t WHERE id = $1
你最简单的选择是:
- 向QueryDSL发送特性请求
- 在QueryDSL级别或R2DBC级别或其他级别上修补生成的SQL,将所有独立的
?
标记替换为$n
(这将与regex一起棘手,可能需要一个简单的解析器来识别注释,字符串字面量等) - 直接使用R2DBC