Spring数据中IQueryable的等价物

时间:2016-01-18 19:40:08

标签: java spring spring-data iqueryable

我习惯使用.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();
}

1 个答案:

答案 0 :(得分:4)

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

public interface GreetingRepository extends QueryDslPredicateExecutor<Greeting> {}

然后,您可以使用QueryDSL生成的QModel生成Predicate并将其传递给greetingRepository。假设我们要由一个特定用户过滤所有Greeting

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

greeting是由QueryDSL根据我们的Greeting模型生成的元模型

注1 :您可以看到如何集成Spring Data和QueryDSL here,并查看QueryDSL的Predicate s here的更多示例。

注意2 QueryDslPredicateExecutor还提供了findOne(Predicate predicate)count(Predicate predicate)exists(Predicate predicate)方法,这些方法当然是有用且不言自明的。< / p>

注3 :您可以使用Specification实现几乎相同的功能,但在我的操作中,QueryDSL具有更优雅和可读性Predicate