Spring Data MongoDB尝试为自定义存储库方法生成查询

Rya*_*ney 9 java mongodb spring-data spring-data-document

基于Spring Data Document文档,我提供了一个存储库方法的自定义实现.自定义方法的名称是指域对象中不存在的属性:

@Document
public class User {
    String username;
}

public interface UserRepositoryCustom {
    public User findByNonExistentProperty(String arg);
}

public class UserRepositoryCustomImpl implements UserRepositoryCustom {
    @Override
    public User findByNonExistentProperty(String arg) {
        return /*perform query*/;
    }
}

public interface UserRepository
        extends CrudRepository<?, ?>, UserRepositoryCustom {

    public User findByUsername(String username);
}
Run Code Online (Sandbox Code Playgroud)

但是,也许是因为我选择了方法名称(findByNonExistentPropertyName),Spring Data尝试解析方法名称,并从中创建查询.当它找不到nonExistentPropertyUser,会抛出异常.

可能的决议:

  1. 我在如何提供自定义方法的实现方面犯了错误吗?
  2. 有没有办法指示Spring不尝试根据此方法的名称生成查询?
  3. 我是否必须避免使用Spring Data识别的任何前缀?
  4. 以上都不是.

谢谢!

Oli*_*ohm 10

UserRepositoryImpl当我们尝试根据找到的Spring Data存储库接口的名称查找它时,必须命名您的实现类(如果您坚持使用默认配置).我们从这个开始的原因是我们无法可靠地知道您扩展的哪个接口是具有自定义实现的接口.鉴于这样的情况

public interface UserRepository extends CrudRepository<User, BigInteger>,
  QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }
Run Code Online (Sandbox Code Playgroud)

我们不得不以某种方式硬编码接口,不检查自定义实现类,以防止意外接收.

所以我们通常建议提出一个命名约定,让我们说Custom接口的后缀包含手动实现的方法.然后,您可以CustomImpl使用元素的repository-impl-postfix属性设置存储库基础结构,以使用as后缀来获取实现类repositories:

<mongo:repositories base-package="com.acme" 
                    repository-impl-postfix="CustomImpl" />
Run Code Online (Sandbox Code Playgroud)

参考文档中有关于此的更多信息,但似乎您至少已经对此进行了简要检查.:)