在我们的项目中,我们使用了两个数据库,一个是postgres,一个是mssql。我们使用Jooq来查询这些数据库,而使用postgres,一切都非常简单!
但在使用mssql时,我们面临一些麻烦。任务是选择前10个值,假设我们有以下java代码:
DSL.using(conn)
.select(USE_CASE.asterisk())
.from(USE_CASE)
.where(USE_CASE.RECORD_ACTIVE.eq(true))
.orderBy(USE_CASE.CREATED_ON.desc())
.limit(10)
.offset(0)
.fetch(new UseCaseMapper()))
这就像postgres的护身符一样,但在mssql上,我们得到了以下错误:
Execution exception[[CompletionException: org.jooq.exception.DataAccessException:
SQL [select "park"."dbo"."use_case".* from "park"."dbo"."use_case" where
"park"."dbo"."use_case"."record_active" = ?
order by "park"."dbo"."use_case"."created_on" desc limit ?];
Incorrect syntax near 'limit'.]]
我知道对于mssql,等价的查询应该是这样的,
select top 10 *
from use_case
where record_active = true
order by created_on desc;
如何更改java代码以获取mssql中的限制记录?
发布于 2019-06-12 03:05:06
正确的SQLDialect
异常消息提示您仍在使用PostgreSQL (或其他一些非SQL Server)方言,因为您的目录/模式/表/列是使用"double_quotes"
而不是[brackets]
引用的。
在SQL Server上运行查询时,只需使用SQLDialect.SQLSERVER
即可。然后,LIMIT 10
语法将被正确转换为TOP 10
。
jOOQ专业版与jOOQ开源版
从我们发布的错误消息中,不太清楚您实际上是如何配置jOOQ集成的,但是如果您在使用DSL.using(Connection)
时没有显式地指定SQLDialect
,并且jOOQ没有正确地“猜测”适当的SQLDialect
,这主要是由于以下两个原因之一:
SQLDialect.DEFAULT
,这会为您的生成错误的SQL语法。
org.jooq
),而不是jOOQ专业版(Maven groupId org.jooq.pro
,需要手动安装,因为它不是通过Maven中心分发的),这也会导致jOOQ使用SQLDialect.DEFAULT
。通知:这也可能是偶然发生的,例如,通过Spring Boot或其他已经依赖于jOOQ开源版的框架引入的传递依赖。在这种情况下,您必须确保将该传递依赖从类路径中排除。在Maven中,您可以使用mvn dependency:tree
显示所有依赖项
https://stackoverflow.com/questions/56546414
复制相似问题