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

时间:2011-11-11 01:27:29

标签: java mongodb spring-data spring-data-document

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

@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);
}

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

可能的决议:

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

1 个答案:

答案 0 :(得分:10)

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

public interface UserRepository extends CrudRepository<User, BigInteger>,
  QueryDslPredicateExecutor<User>, UserRepositoryCustom { … }

我们必须以某种方式对接口进行硬编码,以便不检查自定义实现类以防止意外接收。

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

<mongo:repositories base-package="com.acme" 
                    repository-impl-postfix="CustomImpl" />

reference documentation中有关于此的更多信息,但似乎您至少已经对此进行了简要检查。 :)