将参数注入spring-data动态查询构建方法

时间:2015-06-22 20:12:40

标签: java spring spring-data repository-pattern query-builder

我想知道是否可以在动态生成的CrudRepository查询方法中注入一些功能,以便为存储库中的所有方法提供额外的filterBy条件。

简短版本,我想要

    Page<Collection> findByName(@Param("name") String name);

就像它被命名为

一样工作
    Page<Collection> findByNameAndGroup(@Param("name") String name);

我在impl创建时为生成的代码添加了 AndGroup 标准。 我不想在任何地方添加它,因为它将在所有方法上,并且参数已经知道。

我最初的想法是扩展repo类,并添加一些使用添加的参数调用生成的方法的新方法,但后来我意识到repo仅被定义为接口,因此无法扩展它,并添加任何impl都会影响spring-data impl的产生。至少,我认为它是如何运作的。

详情:

我有一个MongoRepository,它有很多使用spring-data query-builder语法生成的API方法。 (http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#repositories.query-methods.query-creation

主要回购类:

@RepositoryRestResource
public interface CollectionRepository extends MongoRepository<Collection, String> {

    Page<Collection> findByName(@Param("name") String name);
    Page<Collection> findByNameRegex(@Param("name") String name);
    // lots more findBy methods here...
}

repo对象集合只是一个具有名称和组ID的对象:

@Document
public class Collection {
    private String name;
    private String group;
}

我的经过身份验证的用户对象是:

@Document
public class Collection {
    private String username;
    private String password;
    private String group;
}

在所有情况下,用户的群组都需要过滤用户可以看到的馆藏。

以上findBy ...()中的每一个都需要成为一个findBy ... AndGroup(),这是可能的,因为该组是集合中的一个元素。

简单的方法是简单地将新参数添加到每个方法中,即:

@RepositoryRestResource
public interface CollectionRepository extends MongoRepository<Collection, String> {

    Page<Collection> findByNameAndGroup(@Param("name") String name);
    Page<Collection> findByNameRegexAndGroup(@Param("name") String name);
    // lots more methods here...
}

这也使客户端不必要地传入一个已经从用户上下文中获知的参数。

如果我没有使用spring-data而且我必须实际为控制器编写代码,我会从读取用户组的所有API处理程序中调用一个方法:

  User user = (User)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  String group = user.getGroup();

并将其添加到调用方法的filterBy条件。

是否可以将此功能连接到spring-data基础结构中,以便为此接口生成的find ...()方法将“... ByGoup”条件添加到所有方法,并传入一个方法来使用提取这个组参数?

换句话说,我是否可以更改存储库实例以影响使用提供的方法提取用户组的所有生成方法,将此ByGroup过滤器添加到spring根据方法名称生成的初始条件?

是否可以使用aspectJ来连接前/后方法处理程序来执行此操作?

1 个答案:

答案 0 :(得分:2)

目前没有直接支持。 Spring Data JPA已经支持在手动查询定义中使用SpEL表达式,例如Spring Security特定函数可用于JPQL查询。这在this example项目中显示,但需要手动定义查询。

我们目前正在研究一种机制,以提供增强Spring Data执行的所有查询的方法。请务必关注基础架构的DATACMNS-293以及DATAJPA-307以获取软删除的示例实现。

对于DATACMNS-293,我们已经提供了功能分支构建,以便您可以尝试构建自己的QueryAugmentorAnnotationBasedQueryAugmentor可能是您想要查看的类型。