相当于 Spring Data 中的 IQueryable

Flo*_* F. 2 java spring iqueryable spring-data

我习惯了 .Net 和 LINQtoEntities,尤其是 IQueryable 部分,它允许在获取结果之前通过不同的函数来承载请求。

弹簧数据中是否存在这样的东西?或任何其他 java ORM ?

我希望能够做的基本示例:

private IQueryable<Todo> GetAll(){
  context.Todos.Where(t => !t.Deleted);
}

public IEnumerable<Todo> GetDoneTodos(){
  GetAll().Where(t => t.Done).ToList();
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*ani 5

您可以使用 Spring Data 的QueryDSL集成。基本上,您QueryDslPredicateExecutor在存储库接口中扩展 ,并添加一个findAll方法来获取 QueryDSLPredicate并基于该 过滤所有结果Predicate。假设我们有域对象,比如说Greeting,那么我们会有这样的存储库:

public interface GreetingRepository extends QueryDslPredicateExecutor<Greeting> {}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用QModelQueryDSL生成的生成的 s 来创建一个Predicate并将其传递给我们的greetingRepository. 假设我们要按Greeting一个特定用户过滤所有s:

Predicate filterByUser = greeting.user.eq(someUser);
greetingRepository.findAll(filterByUser);
Run Code Online (Sandbox Code Playgroud)

greeting是QueryDSL 基于我们的模型生成的Greeting模型。

注1:你可以看到你是如何整合春数据和QueryDSL这里,看看QueryDSL的更多的例子Predicate小号这里

注2QueryDslPredicateExecutor也提供findOne(Predicate predicate)count(Predicate predicate)exists(Predicate predicate)方法,其当然是有用的,不言自明的。

注 3:你可以用Specifications实现几乎相同的事情,但在我看来,QueryDSL 有更优雅和可读的Predicates。