使用 MSSQL 数据库的 Spring Boot 查询失败

Posted

技术标签:

【中文标题】使用 MSSQL 数据库的 Spring Boot 查询失败【英文标题】:Spring boot query failing with MSSQL database 【发布时间】:2017-04-19 14:43:24 【问题描述】:

我有一个 Spring Boot 应用程序版本 1.4.3.RELEASE 使用驱动程序版本 4.1 与 MS SQL db 一起使用

我尝试通过以下方式实现查询以获取前 100 个结果

public interface EventTrackingService extends CrudRepository<EventTracking, Integer> 

    public List<EventTracking> findBySwitchIpOrderByTimestampDesc(String switchIp);

    public List<EventTracking> findTop100ByOrderByTimestampDesc();  


项目编译得很好,但是当我点击第二个查询 findTop100ByOrderByTimestampDesc 时,我收到以下错误:

休眠: /* 选择 生成别名0 从 EventTracking as generatedAlias0 订购 generatedAlias0.timestamp desc /选择 最佳 ? eventtrack0_.nEventNumber 作为 nEventNu1_9_, eventtrack0_.strAction 作为 strActio2_9_, eventtrack0_.strEventMsg 作为 strEvent3_9_, eventtrack0_.strEventType 为 strEvent4_9_, eventtrack0_.FHandleEvent 作为 FHandleE5_9_, eventtrack0_.StrIpAddress 作为 StrIpAdd6_9_, eventtrack0_.strMACAddress 作为 strMACAd7_9_, eventtrack0_.nPort 作为 nPort8_9_, eventtrack0_.strSwitchIP 作为 strSwitc9_9_, eventtrack0_.nDate 为 nDate10_9_ 从 SWAT.dbo.tblEventsTracking eventtrack0_ 订购 eventtrack0_.nDate desc 2017-04-20 03:38:28.791 调试 11016 --- [-nio-555-exec-3] c.m.s.jdbc.internals.SQLServerStatement : SQLServerPreparedStatement:3 创建者 (ConnectionID:10 ClientConnectionId:a144ec47-037d-40a7-be92-db1725614208) 2017-04-20 03:38:28.807 调试 11016 --- [-nio-555-exec-3] c.m.s.jdbc.internals.SQLServerStatement : SQLServerPreparedStatement:3: 调用 sp_prepexec: PreparedHandle:0, SQL:/ 从 EventTracking 中选择 generatedAlias0 作为 generatedAlias0 按 generateAlias0.timestamp desc */ 选择 TOP @P0 排序 eventtrack0_.nEventNumber 为 nEventNu1_9_,eventtrack0_.strAction 为 strActio2_9_, eventtrack0_.strEventMsg as strEvent3_9_, eventtrack0_.strEventType 为 strEvent4_9_, eventtrack0_.FHandleEvent 作为 FHandleE5_9_, eventtrack0_.StrIpAddress 作为 StrIpAdd6_9_, eventtrack0_.strMACAddress as strMACAd7_9_, eventtrack0_.nPort as nPort8_9_, eventtrack0_.strSwitchIP 作为 strSwitc9_9_, 来自 SWAT.dbo.tblEventsTracking 的 eventtrack0_.nDate 为 nDate10_9_ eventtrack0_ order by eventtrack0_.n日期 desc 2017-04-20 03:38:28.815 调试 11016 --- [-nio-555-exec-3] c.m.s.jdbc.internals.SQLServerException:*** SQLException: com.microsoft.sqlserver.jdbc.SQLServerException:附近的语法不正确 '@P0'。消息 102,级别 15,状态 1,“@P0”附近的语法不正确。 2017-04-20 03:38:28.815 警告 11016 --- [-nio-555-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper:SQL 错误:102,SQLState: S0001 2017-04-20 03:38:28.815 错误 11016 --- [-nio-555-exec-3] o.h.engine.jdbc.spi.SqlExceptionHelper:附近的语法不正确 '@P0'。

这是数据库的 JPA 错误还是我的查询错误

我使用了这里的参考资料 https://spring.io/blog/2014/10/15/whats-new-in-spring-data-evans#user-content-statically-limiting-results

【问题讨论】:

请同时发布您的EventTracking 课程。 在我看来,您不需要第一个“By”,因为没有查询参数。所以只需尝试 findTop100OrderByTimestampDesc 没有第一个项目无法编译,在这里找到解决办法***.com/questions/20374437/… 【参考方案1】:

FirstTop 关键字在某些 SQL 实现中表现不佳,如果我没记错的话,它们不适用于 mysql。我总是遇到这个问题,所以我只是在这一点上避免它们。最简单的选择是在您的请求中使用Pageable 并以这种方式限制它。

所以这个:

public List&lt;EventTracking&gt; findTop100ByOrderByTimestampDesc();

会变成这样:

public List&lt;EventTracking&gt; findAllByOrderByTimestampDesc(Pageable pageable);

你会像这样构建参数对象:

Pageable pageable = new PageRequest(0, 100);

不像使用TopFirst 那样干净,而是绕过SQL 兼容性问题的快速修复,它比将整个结果集放入数组并取出其中的前“n”个更快...

编辑:

另外,检查您的 Spring Data JPA 版本,它需要是 1.7 或更高版本。如果这不起作用,则是数据库兼容性问题。

【讨论】:

以上是关于使用 MSSQL 数据库的 Spring Boot 查询失败的主要内容,如果未能解决你的问题,请参考以下文章

自定义订购 MSSQL 休眠 Spring Boot 2

如果我们保持空闲一段时间,则在连接到 Azure MSSQL DB 时,Spring Boot 应用程序中的数据库连接将关闭

spring boot 生成错误的sql代码

使用 Spring Boot 应用程序正确设置 MS SQL Server?

Spring Boot 未使用 Spring Data 和 Hibernate 与 sql Server 一起运行

Spring Boot Kotlin 暴露存储过程