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
相关产品推荐
相关产品推荐

