如何实现像仓库这样的Spring Data

问题描述

我有以下界面(在kotlin中):

 interface QueryRepository<T> {
  fun findExpenses(filter: IFilter): Flux<T>
}

为了像弹簧数据一样仅使用接口,我想到了这个。首先,我创建一个扩展它的新接口,并提供类型(java):

public interface ExpenseQueryRepository extends QueryRepository<Expense> {
}

然后提供实现(java):

public class ExpenseQueryRepositoryImpl implements ExpenseQueryRepository {
  private final FilterFactory<Query> filterFactory;
  private final ReactiveMongoTemplate template;

  @Autowired
  public ExpenseQueryRepositoryImpl(FilterFactory<Query> filterFactory,ReactiveMongoTemplate template) {
    this.filterFactory = filterFactory;
    this.template = template;
  }

  @Override
  public Flux<Expense> findExpenses(IFilter filter) {
    var documentFilter = filterFactory.transformFilters(filter,Expense.class);
    return template.find(documentFilter,Expense.class);
  }
}

现在我可以用我的实现和spring数据的实现创建一个接口:

public interface ExpenseRepository extends ReactiveMongoRepository<Expense,String>,ExpenseQueryRepository {
}

这有效。但是,在ExpenseQueryRepository中,代码可以重复使用,只需要一个不同的类即可。我不能仅通过类型定义获得它。 Kotlin的reified类型不是这里的选项-否则我无法正确使用它。 所以我的问题是,有没有一种方法可以以一种通用的方式提供实现,而最终只能定义:

public interface ExpenseRepository extends ReactiveMongoRepository<Expense,QueryRepository<Expense> { }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...