首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Jooq与SQL Server如何选择前N个结果

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

Stack Overflow用户
提问于 2019-06-11 22:51:24
回答 1查看 609关注 0票数 1

在我们的项目中,我们使用了两个数据库,一个是postgres,一个是mssql。我们使用Jooq来查询这些数据库,而使用postgres,一切都非常简单!

但在使用mssql时,我们面临一些麻烦。任务是选择前10个值,假设我们有以下java代码:

代码语言:javascript
复制
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上,我们得到了以下错误:

代码语言:javascript
复制
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,等价的查询应该是这样的,

代码语言:javascript
复制
select top 10 * 
from use_case 
where record_active = true
order by created_on desc;

如何更改java代码以获取mssql中的限制记录?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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,这主要是由于以下两个原因之一:

  1. 您正在使用一些jOOQ无法识别的非标准JDBC URL。因此,它使用SQLDialect.DEFAULT,这会为您的

生成错误的SQL语法。

  1. 您使用的是jOOQ开放源码版(Maven groupId org.jooq),而不是jOOQ专业版(Maven groupId org.jooq.pro,需要手动安装,因为它不是通过Maven中心分发的),这也会导致jOOQ使用SQLDialect.DEFAULT

通知:这也可能是偶然发生的,例如,通过Spring Boot或其他已经依赖于jOOQ开源版的框架引入的传递依赖。在这种情况下,您必须确保将该传递依赖从类路径中排除。在Maven中,您可以使用mvn dependency:tree显示所有依赖项

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56546414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档