Spring 数据中 IQueryable 的等价物

Equivalent of IQueryable in Spring Data

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

spring 数据中是否存在类似的内容?或任何其他 java ORM ?

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

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

public IEnumerable<Todo> GetDoneTodos(){
  GetAll().Where(t => t.Done).ToList();
}

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

public interface GreetingRepository extends QueryDslPredicateExecutor<Greeting> {}

然后你可以使用QueryDSL生成的QModels来创建一个Predicate并传递给我们的greetingRepository。假设我们要按一个特定用户过滤所有 Greeting

Predicate filterByUser = greeting.user.eq(someUser);
greetingRepository.findAll(filterByUser);

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

注释 1:您可以看到如何集成 Spring 数据和 QueryDSL here and see more examples for QueryDSL's Predicates here.

注2:QueryDslPredicateExecutor也提供了findOne(Predicate predicate),count(Predicate predicate),exists(Predicate predicate)方法,self-explanatory,当然。

注释 3:您可以使用 Specification 实现几乎相同的结果,但在我看来,QueryDSL 具有更优雅和可读性更好的 Predicate