Spring Boot CrudRepository查询@ElementCollection映射键的实现方法
搞定JPA查询带Map键的User实体
嘿,针对你遇到的这个查询问题,我给你两种靠谱的实现方案,都是Spring Data JPA里的标准玩法:
方案1:用Spring Data方法命名规则(不用写@Query)
Spring Data JPA对集合类型的属性有内置的命名支持,针对你的emails这个Map属性,直接用下面的方法签名就行:
User findOneByEmailsContainingKey(String email);
这个命名规则的逻辑很直观:findOneBy[Map属性名]ContainingKey,框架会自动生成查询语句,找出emails的keySet里包含传入邮箱的User实体,完全不用自己写JPQL,省心!
方案2:自定义@Query注解实现
如果你更倾向于自己写查询语句,那得修正你原来的JPQL写法,注意JPQL里操作Map键的特殊语法:
@Query("select u from User u where :email in KEY(u.emails)") User findOneByQueryForEmail(@Param("email") String email);
这里要注意几个关键的修正点:
- 用命名参数
:email替代原来的位置参数?,可读性更强,也避免参数顺序搞错的问题 - JPQL里不能直接写
u.emails.keySet,要改用KEY(u.emails)来引用Map的键集合,这是JPA规范里的标准写法 - 必须用
@Param("email")把方法的参数和JPQL里的命名参数绑定起来,不然框架找不到对应关系
另外提一句,你原来的findOneByUsername(String username)写法其实是有效的,如果实际运行有问题,可能是Spring Data版本过低或者实体类的配置问题,但这不是你当前的核心问题,先搞定邮箱查询再说~
内容的提问来源于stack exchange,提问作者mikeb
相关产品推荐
相关产品推荐

