使用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

