Spring Data派生查询保留字问题:findByNameOrSurname方法报错解决
问题核心原因
Spring Data 派生查询的方法名解析规则是固定的:遇到And、Or这类内置逻辑关键字,会优先把它当成条件拼接的逻辑操作符,而不是属性名的一部分。
你写的findByNameOrSurname,解析器的拆分逻辑是:
- 去掉固定查询前缀
findBy - 识别到大写开头的
Or,判定为逻辑或连接符 - 尝试找
Or前后对应的两个实体属性:name、surname
它根本不会识别你实体上那个连在一起的nameOrSurname单属性,自然就会抛出找不到name属性的映射异常。
可直接用的解决方案
- 方案1:用
@Query注解手写JPQL,绕开方法名解析(推荐优先使用,零改动成本)
不需要修改任何现有实体、表结构,直接在Repository方法上显式指定查询逻辑即可:
这种方式完全不解析自定义方法的方法名,自然不会出现拆分错属性的问题。@Query("SELECT e FROM YourEntity e WHERE e.nameOrSurname = :target") List<YourEntity> findByNameOrSurname(@Param("target") String target); - 方案2:重构属性命名(适合项目早期可调整的场景)
把实体上和关键字冲突的nameOrSurname属性,改成不带逻辑关键字的命名,比如改成nameSearchKey,通过@Column(name = "name_or_surname")关联原数据库字段。调整后就可以正常写派生查询findByNameSearchKey,不会再触发拆分歧义。 - 方案3:校验基础映射配置
排查是否存在实体属性拼写错误、属性被@Transient标记为非持久化字段、列名映射注解写错的问题,排除基础配置错误后再排查方法名解析问题。
内容的提问来源于stack exchange,提问作者palindrom
相关产品推荐
相关产品推荐

