【问题标题】:Equivalent of IQueryable in Spring DataSpring Data 中 IQueryable 的等价物
【发布时间】:2016-01-18 19:40:08
【问题描述】:

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

【问题讨论】:

    标签: java spring spring-data iqueryable


    【解决方案1】:

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

    public interface GreetingRepository extends QueryDslPredicateExecutor<Greeting> {}
    

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

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

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

    注意 1:您可以查看如何集成 Spring Data 和 QueryDSL here 并查看更多示例 QueryDSL 的 Predicates here

    注意 2QueryDslPredicateExecutor 还提供了 findOne(Predicate predicate)count(Predicate predicate)exists(Predicate predicate) 方法,这些方法当然有用且一目了然。

    注意 3:您可以使用 Specifications 实现几乎相同的效果,但在我看来,QueryDSL 具有更优雅和可读性更高的 Predicates。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多