Jooq与SQL Server如何选择前N个结果

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (18)

在我们的项目中,我们使用两个数据库,一个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中的限制记录?

提问于
用户回答回答于

正确 SQLDialect

异常消息暗示您仍在使用PostgreSQL(或其他一些非SQL Server)方言,因为您的目录/模式/表/列是使用"double_quotes"而不是[brackets]

只需SQLDialect.SQLSERVER在SQL Server上运行查询时使用。该LIMIT 10语法将被正确地转换为TOP 10

jOOQ专业版vs jOOQ开源版

从我们发布的错误消息来看,你是如何真正配置你的jOOQ集成还不是很清楚,但是如果你在DSL.using(Connection)没有明确指定的情况下使用SQLDialect,并且jOOQ没有正确“猜测”相应的SQLDialect,这可能主要是因为其中一个两个原因:

  1. 您使用的是一些非标准的JDBC URL,jOOQ无法识别。因此SQLDialect.DEFAULT,它使用了为您生成错误的SQL语法。
  2. 您使用的是jOOQ开源版(Maven groupId org.jooq)而不是jOOQ专业版(Maven groupId org.jooq.pro,需要手动安装,因为它不是通过Maven Central分发的),这也会导致使用jOOQ SQLDialect.DEFAULT

扫码关注云+社区

领取腾讯云代金券