Spring Data JPA原生查询如何按Map索引查询关联子实体字段
问题解决
报错原因
你当前写的@Query默认是JPQL而非原生SQL,错误有两个:
- 直接使用
a.bbbDetails['BBBType.FIRST']写法无法被Hibernate正确解析,枚举值被当作普通字符串处理,还带了类名前缀,导致生成的SQL中出现了无效的bbbde1_.null字段 - 若要使用原生SQL,需要在@Query注解中添加
nativeQuery = true属性
解决方案
方案1:使用JPQL(推荐,无需绑定具体表结构)
通过KEY()、VALUE()函数处理Map类型的关联属性,写法更兼容:
@Query("select a.Id from AAA a join a.bbbDetails bbbEntry " + "where a.status = :status " + "and KEY(bbbEntry) = :bbbType " + "and VALUE(bbbEntry).flag = false") List<String> findAllIdsByTypeAndStatus(@Param("status") String status, @Param("bbbType") BBBType bbbType);
调用方法时直接传入BBBType.FIRST作为参数即可。
方案2:使用原生SQL
如果确定要用原生查询,需要匹配实际的表结构和字段名,示例如下:
@Query(value = "select a.id from aaa a inner join bbb b on a.id = b.id " + "where a.status = :status " + "and b.bbb_type = :bbbTypeStr " + "and b.flag = false", nativeQuery = true) List<String> findAllIdsByTypeAndStatusNative(@Param("status") String status, @Param("bbbTypeStr") String bbbTypeStr);
调用方法时传入BBBType.FIRST.name()作为枚举字符串参数即可。
额外优化建议
你BBB实体中@JoinColumn(name = "Id")的命名容易和AAA的主键Id混淆,建议修改为aaa_id这类更清晰的命名,避免后续出现字段映射错误。
内容的提问来源于stack exchange,提问作者Sel_va
相关产品推荐
相关产品推荐

