mybatis-plus findIDialect sql server2012判断错误

wsewodh2  于 2021-11-27  发布在  Java
关注(0)|答案(4)|浏览(332)

当前使用版本(必填,否则不予处理)

3.4.3.4

该问题是如何引起的?(确定最新版也有问题再提!!!)

sqlserver2012 的 地址 并不是 :sqlserver2012:
现在的判断会导致 SQL server都是用旧版分页

重现步骤(如果有就写完整)

报错信息

gzszwxb4

gzszwxb42#

jdbc:microsoft:sqlserver: 是旧版的
jdbc:sqlserver: 是新版的。(至少我现在程序用的连接url是这个,然后用2012的分页)

30byixjq

30byixjq3#

@linyouq 我的 SQL Server 版本: Microsoft SQL Server 2019 (RTM-CU12) (KB5004524) - 15.0.4153.1 (X64)

如果分页插件使用 DbType.SQL_SERVER

不添加 order by 会触发以下错误


### The error may involve defaultParameterMap

### The error occurred while setting parameters

### SQL: SELECT  id,code,name,del_flag  FROM area_code   WHERE del_flag IS NULL OFFSET ? ROWS FETCH NEXT ? ROWS ONLY

### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'OFFSET'.

; uncategorized SQLException; SQL state [S0001]; error code [102]; Incorrect syntax near 'OFFSET'.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Incorrect syntax near 'OFFSET'.] with root cause

添加 order by 后可用

==>  Preparing: SELECT id,code,name,del_flag FROM area_code WHERE del_flag IS NULL ORDER BY id ASC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY
==> Parameters: 0(Long), 2(Long)
<==    Columns: id, code, name, del_flag
<==        Row: DEAEB43A-33C2-894C-AB97-0212F3DD6D5E, 310000, 浙江省, null
<==        Row: 7E66D8E6-A2C2-C344-ABA2-D5AAA625D92C, 120000, 天津市, null
<==      Total: 2

使用 DbType.SQL_SERVER2005 就没有问题

无论是否有 order by 都正常

有 order by

==>  Preparing: WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY id ASC) as __row_number__, id,code,name,del_flag FROM area_code WHERE del_flag IS NULL ORDER BY id ASC) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__
==> Parameters: 
<==    Columns: __row_number__, id, code, name, del_flag
<==        Row: 1, DEAEB43A-33C2-894C-AB97-0212F3DD6D5E, 310000, 浙江省, null
<==        Row: 2, 7E66D8E6-A2C2-C344-ABA2-D5AAA625D92C, 120000, 天津市, null
<==      Total: 2

无 order by

==>  Preparing: WITH selectTemp AS (SELECT TOP 100 PERCENT ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, id,code,name,del_flag FROM area_code WHERE del_flag IS NULL) SELECT * FROM selectTemp WHERE __row_number__ BETWEEN 1 AND 2 ORDER BY __row_number__
==> Parameters: 
<==    Columns: __row_number__, id, code, name, del_flag
<==        Row: 1, DEAEB43A-33C2-894C-AB97-0212F3DD6D5E, 310000, 浙江省, null
<==        Row: 2, 7E66D8E6-A2C2-C344-ABA2-D5AAA625D92C, 120000, 天津市, null
<==      Total: 2

总结如下:

  • 不论SQL Server 版本是多少,尽量先不要使用 SQL Server 2012 提供的新分页,那个必须与 order by 组合使用,通用性较差。
  • 如果非要使用 SQL Server 2012的新语法,保证代码中每个分页至少有一个 order by
7tofc5zh

7tofc5zh4#

我是想说明我截图的那段代码是错误的。

至于@code-farmhand

问题不是使用SQL Server 2012 提供的新分页的时候会报错。必须与 order by 组合使用没毛病。
问题在于,
多数据源多类型数据库的时候。框架判断DbType 是 DbType.SQL_SERVER2005
不是哪个能用的问题。是判断的逻辑出错了。

单个数据数据源想用哪个就设置哪个。
多个不同类型数据源,SQL SERVER 数据源就要使用 DbType.SQL_SERVER 对应的分页 就只能重写相应代码。

或者有什么办法能直接指定不同数据源使用的分页方言?

相关问题