能否将Query对象作为MongoRepository方法参数?如何正确命名方法
解决方案
你遇到的报错本质是方法名触发了Spring Data的查询派生机制:只要方法名包含findBy/countBy/existsBy/deleteBy这类关键字,Spring就会把By后面的字符串解析为实体类的属性名,自动生成匹配条件;你写findByQuery时框架会去找Person类下的query属性,写find时框架也会尝试把方法名解析为属性路径,自然会抛出找不到属性的错误。
要实现直接传入服务层构建的Query对象查询、不使用@Query注解,不需要遵循查询派生的命名规则,按以下要求写即可:
- 首先确保你的Repository接口继承
org.springframework.data.mongodb.repository.MongoRepository<Person, 你的主键类型> - 定义方法时不要在方法名中使用
By关键字,避免触发查询派生逻辑,方法名可以取任意合法名称,比如list、pageQuery、findList都可以 - 方法第一个参数定义为
org.springframework.data.mongodb.core.query.Query类型,后续按需添加Pageable参数,返回值可以根据需求写为List<Person>或者Page<Person>
正确代码示例
import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import java.util.List; public interface PersonRepository extends MongoRepository<Person, String> { // 返回列表的正确写法 List<Person> list(Query query, Pageable pageable); // 返回分页对象的正确写法 Page<Person> pageQuery(Query query, Pageable pageable); }
注意事项
- 传入的
Pageable参数会自动被框架应用到查询中,不需要你手动在Query对象里拼接skip、limit、排序条件,避免重复配置 - 如果你手动在
Query中设置了分页/排序参数,框架会优先以Pageable中的配置覆盖Query中的同类配置 - 不要使用
findAll作为方法名,会和MongoRepository内置的findAll(Pageable pageable)方法产生重载冲突
内容的提问来源于stack exchange,提问作者stakeika
相关产品推荐
相关产品推荐

