Spring Data原生SQL查询出现重复别名[id]错误求助
解决Spring Data JPA原生查询重复SQL别名错误
问题原因
你的原生查询通过JOIN同时返回了t1.id和t2.id,这两个字段的别名都是id,Spring Data JPA在自动映射WesternEs实体时,无法区分重复的列名,因此抛出重复别名错误。
解决方案
方案1:只查询主表字段(推荐)
修改查询语句,明确选择主表t1的所有字段,避免子查询的id被包含在返回结果中:
@Query(value = "SELECT t1.* FROM t_western_es AS t1 JOIN (SELECT id FROM t_western_es " + "ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id", nativeQuery = true) List<WesternEs> findRandom();
这样返回结果中只有t_western_es表的字段,不会出现重复的id别名,实体映射可以正常完成。
方案2:简化查询语句(适合数据量不大的场景)
如果你的数据量不大,可以直接简化查询,去掉JOIN逻辑,直接随机取10条数据:
@Query(value = "SELECT * FROM t_western_es ORDER BY RAND() LIMIT 10", nativeQuery = true) List<WesternEs> findRandom();
这种写法更简洁,但数据量较大时,ORDER BY RAND()会全表扫描并排序,性能不如JOIN方式。
方案3:显式指定字段并去重别名(可选)
如果需要保留JOIN逻辑,也可以显式列出所有需要的字段,并确保没有重复别名:
@Query(value = "SELECT t1.id, t1.column1, t1.column2, ... FROM t_western_es AS t1 JOIN (SELECT id FROM t_western_es " + "ORDER BY RAND() LIMIT 10) as t2 ON t1.id=t2.id", nativeQuery = true) List<WesternEs> findRandom();
这里需要把column1、column2替换成你实体对应的所有字段,确保只选择t1的字段,避免重复。
内容的提问来源于stack exchange,提问作者Nunyet Calçada
相关产品推荐
相关产品推荐

