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

Spring @Query JPQL转原生SQL异常:嵌入字段引发SQL语法错误

解决JPQL查询因嵌入式对象导致的SQL语法错误问题

你遇到的问题根源在于JPQL的JOIN写法没有正确关联CharacterDisposition和CharacterSlot的一对多关系,虽然对嵌入式对象的属性引用路径是正确的,但JOIN的关联逻辑出错,导致Hibernate生成了语法混乱的原生SQL。

问题分析

原JPQL中直接写了JOIN CharacterSlot cs,但没有明确关联到CharacterDisposition的slots集合属性——Hibernate无法识别这两个实体之间的关联关系,所以生成了错误的SQL(出现多余的ON关键字,WHERE子句位置异常)。

修正后的JPQL查询

你需要把JOIN关联到CharacterDisposition的slots集合,这样Hibernate才能正确生成关联条件,同时保留对嵌入式SceneCharacter中character属性的引用:

@Query("SELECT cd " +
       "FROM CharacterDisposition cd " +
       "JOIN cd.slots cs " +  // 明确关联cd的slots集合,让Hibernate识别关联关系
       "WHERE cs.sceneCharacter.character = :character")
List<CharacterDisposition> findCharacterDispositionWithCharacterDependency(Charakter character);

额外优化:避免重复结果

如果一个CharacterDisposition对应多个匹配的CharacterSlot,查询结果会出现重复的CharacterDisposition实例。可以通过DISTINCT关键字去重:

@Query("SELECT DISTINCT cd " +
       "FROM CharacterDisposition cd " +
       "JOIN cd.slots cs " +
       "WHERE cs.sceneCharacter.character = :character")
List<CharacterDisposition> findCharacterDispositionWithCharacterDependency(Charakter character);

原SQL出错的原因

当你直接JOIN CharacterSlot cs而不关联到cd.slots时,Hibernate无法解析两个实体的关联逻辑,尝试生成的SQL结构混乱,导致出现多余的ON关键字,且WHERE子句错误地紧跟在ON之后,最终触发MySQL的语法报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 14:27:45