You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Spring Boot获取SQL Server当前数据库时间报错如何解决?

问题根因

你遇到的问题本质是@Query默认使用**JPQL(Java持久化查询语言)**语法,而非直接执行原生SQL:

  • 第一条语句SELECT CURRENT_TIMESTAMP不符合JPQL规范:JPQL要求所有查询必须携带FROM子句关联对应实体类,所以解析时直接抛出unexpected end of subtree异常。你直接在SQL Server中执行的是原生SQL,语法不受JPQL约束因此可以正常运行。
  • 第二条语句添加了FROM MYTABLE后符合JPQL语法,但会对MYTABLE的每一行都返回一次当前时间戳,因此结果条数和表行数完全一致,不符合获取单个时间的需求。

正确实现方案

方案1:使用原生查询(最简便)

给@Query添加nativeQuery = true属性,指定直接执行原生SQL,无需符合JPQL语法约束:

@Query(value = "SELECT CURRENT_TIMESTAMP", nativeQuery = true)
public Timestamp getDbCurrentTime();

该方案会直接调用SQL Server的原生语法返回单个时间戳,不需要关联任何业务表。

方案2:使用虚拟表保证单条返回(适配JPQL场景)

如果一定要用JPQL语法,可以借助通用类构造单行结果,避免关联业务表产生多条数据:

@Query("SELECT CURRENT_TIMESTAMP FROM java.lang.Object")
public Timestamp getDbCurrentTime();

或者使用原生SQL的单行虚拟表写法:

@Query(value = "SELECT CURRENT_TIMESTAMP FROM (VALUES(1)) AS temp(id)", nativeQuery = true)
public Timestamp getDbCurrentTime();

方案3:通过JdbcTemplate直接查询

如果不想在Repository层定义方法,也可以直接注入JdbcTemplate执行查询:

@Autowired
private JdbcTemplate jdbcTemplate;

public Timestamp getDbCurrentTime() {
    return jdbcTemplate.queryForObject("SELECT CURRENT_TIMESTAMP", Timestamp.class);
}

内容的提问来源于stack exchange,提问作者askwer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:30:05