2012-07-23 104 views
14

我正在使用基于JSON的查询方法的spring-data mongo,并且不确定如何在搜索查询中允许可选参数。spring-data-mongo - 可选的查询参数?

举例来说 - 说我有以下功能

@Query("{ 'name' : {$regex : ?0, $options : 'i'}, 'createdDate' : {$gte : ?1, $lt : ?2 }} }") 
List<MyItem> getItemsLikeNameByDateRange(String name, Date startDateRange, Date endDateRange); 

- 但我没有想申请的名称正则表达式匹配,但是如果NULL值传递给方法不适用的日期范围限制。

目前,它看起来像我可能要建立一个使用mongoTemplate查询。

是否有任何的替代品 - 或正在使用mongoTemplate最好的选择?

感谢

+0

现在我已经走下了使用Criteria类的路线。它看起来比在注释中嵌入JSON查询要干净得多,而且更容易定制检索哪些字段。 – 2012-07-24 09:03:19

回答

16

要在布尔逻辑实现这一点,我做以下,并转换为在编程语言

:query != null -> field == :query 
!(:query != null) || (field == :query) 
(:query == null) || (field == :query) 

在普通的SQL都可以操作,这是因为

where (null = :query) or (field = :query) 
完成

在MongoDB中,这是通过在$完成,其中

{ $where: '?0 == null || this.field == ?0' } 

我们可以通过使用Mongo的操作,而不是在一些可读性为代价建立的一切功能加快这有点。不幸的是无法工作。

{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] } 

所以,你有什么

@Query("{ $or : [ { $where: '?0 == null' } , { field : ?0 } ] }") 
List<Something> findAll(String query, Pageable pageable); 

这可以进一步扩展到处理数组中/所有条款

@Query("{ $or : [ { $where: '?0.length == 0' } , { field : { $in : ?0 } } ] }") 
List<Something> findAll(String query, Pageable pageable); 
1

你可能有兴趣在此提供反馈或投票问题: https://jira.springsource.org/browse/DATAJPA-209

它与涉及EXA这个问题,除了SD JPA。似乎它适用于许多其他SD子项目。

+0

谢谢,对此投了! – 2013-05-13 10:37:15

0

给定票证处理发现者通过“名字魔法”生成他们的SQL,例如, findByTitleAndSubtitle(),现在工作正常。但是当你使用@Query(“select product where title =:title and subtitle =:subtitle”)注释这个发现者时,仍然存在同样的问题;空值被翻译成“subtitle = null”,因此将不会被发现。