JPA Repository查询Set类型roles字段报错,如何正确按角色筛选实体?
你遇到的报错是因为Contains关键字在Spring Data JPA中默认作用于字符串类型字段,会自动给入参前后拼接%做模糊匹配,而你的roles是Set<String>集合类型,类型不匹配所以触发参数类型错误。你后续写的findAllByInRolesContains不符合Spring Data JPA方法名命名规则,因此无法生效。
首先请确保你实体类的roles字段已经添加@ElementCollection注解完成集合类型的JPA映射,这是后续查询生效的基础:
@ElementCollection private Set<String> roles;
方案1:自定义JPQL查询(兼容性最强,推荐使用)
在你的JPA Repository接口中添加带@Query注解的查询方法:
@Query("SELECT u FROM 你的实体类名 u WHERE :role MEMBER OF u.roles") List<你的实体类名> findAllByRole(@Param("role") String role);
调用方法时直接传入对应角色即可:
// 查询所有属于users角色的实体 return userRepository.findAllByRole("users"); // 查询所有属于managers角色的实体 return userRepository.findAllByRole("managers");
方案2:使用方法名关键字(需Spring Data JPA 2.0及以上版本)
不需要写自定义查询,直接按规则命名方法即可:
List<你的实体类名> findAllByRolesMemberOf(String role);
调用方式和方案1完全一致。
内容的提问来源于stack exchange,提问作者Nikolo Voronin
相关产品推荐
相关产品推荐

