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