【问题标题】: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。
注意 2:QueryDslPredicateExecutor 还提供了 findOne(Predicate predicate)、count(Predicate predicate) 和 exists(Predicate predicate) 方法,这些方法当然有用且一目了然。
注意 3:您可以使用 Specifications 实现几乎相同的效果,但在我看来,QueryDSL 具有更优雅和可读性更高的 Predicates。