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

使用Hibernate执行自定义查询遇QuerySyntaxException问题求助

问题分析与修复方案

咱们一步步拆解你遇到的问题,逐个解决:

1. 实体类名拼写错误

你的Repository里出现了两处低级拼写错误:

  • JpaRepository<Confguration, UUID> 里的 Confguration 应该是 Configuration
  • @Query 语句中的 FROM Configuratin c 里的 Configuratin 也必须改成 Configuration

这种拼写错误会直接导致Hibernate无法识别对应的实体类,进而触发语法解析异常。

2. nativeQuery 参数设置矛盾

你写的查询是JPQL语法(用的是实体类名Configuration和属性名closeDate),但却设置了 nativeQuery = true。这个参数会让Hibernate把查询当作原生SQL执行,而原生SQL需要用数据库表名(configuration)和列名(close_date),和你当前的写法完全不匹配。

解决方法:直接移除 nativeQuery = true 参数,让Hibernate按JPQL规则解析你的查询。

3. 子查询缺少闭合括号

从报错信息能明显看到,子查询的结尾少了一个右括号:

... GROUP BY q.id]

检查你的代码,字符串拼接后的子查询应该是完整的(SELECT c.id, MAX(c.version) AS version FROM Configuration c GROUP BY c.id),另外JPQL的IN子查询里不需要ORDER BY(结果顺序不影响匹配),可以直接去掉ORDER BY c.id简化查询。

4. JpaRepository泛型类型错误

你的实体Configuration用的是复合主键ConfigurationPk,所以Repository的泛型参数必须对应:

JpaRepository<Configuration, ConfigurationPk>

而不是 JpaRepository<Configuration, UUID>,因为主键类型是复合类,不是单个UUID。


修复后的完整Repository代码

@Repository
public interface ConfigurationRepository extends JpaRepository<Configuration, ConfigurationPk> {

    @Query(value = "SELECT c FROM Configuration c" +
            " WHERE c.closeDate IS NULL" +
            " AND (c.id, c.version) IN (" +
            "     SELECT c.id, MAX(c.version) AS version" +
            "     FROM Configuration c" +
            "     GROUP BY c.id)")
    List<Configuration> findAll();
}

额外提醒:你的isNew()方法基于closeDate == null判断新实体,这符合Persistable接口要求,但要确保这个逻辑和你业务中“新实体”的定义完全一致,避免Hibernate持久化操作出现异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 17:13:12