休斯顿,我有一个问题(大家好!)。
我正在使用springdata的@query注释,我需要使用一些条件执行查找查询。
假设我的集合对象是这样的:
- 代码
- 日期
- key
- 帐户 { 电子邮件、名字、姓氏}
- 状态
我的搜索条件对象是
- 代码
- 日期
- key
- 电子邮件
- 状态
我需要在集合中搜索符合我的条件的文档。
问题是搜索条件不是强制性的,所以我可以有一些空参数(例如,有时我必须查找具有特定代码和日期的文档,有时需要特定电子邮件等),所以我开始在谷歌上搜索解决方案。
我读到了有关 $or 和 $and 运算符的内容(我对 and 重复感到抱歉),我尝试实现一个解决方案(我知道,做或不做,没有尝试),但我对如何让它工作感到非常困惑。
目前的情况是:
@Query(value = "{date: { $exists: false }, key: ?0 , $or : [{$or : [{$where: '?1==null'}, {code : ?1}]},{$or : [{$where: '?2==null'}, {status : ?2}]}]}")
public Page<Notification> findByNotificationCriteria(Pageable page, String key, String code, String status);
(我在开始时也尝试过使用 $and 运算符)
但是结果并不是我所期望的。
我做错了什么或者这只是一个 springdata 问题?
谢谢。
最佳答案
我知道这不是真正的解决方案。
- 您可以使用 query-dsl 来完成此任务。这是一个很好的教程:http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html
- (等等)另外看看这个 Jira Issue,如果 spring-jpa 中支持此类东西,那么很快就会在 mongo 中支持。 https://jira.spring.io/browse/DATAJPA-209
- 您还可以直接使用
MongoTemplate
类或 - 通过 spring-data 扩展您的存储库。 http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html
就您而言,我会使用 query-dsl,因为您必须执行一次并覆盖所有存储库。 (1)
注意:为了让它更好一点,不要使用com.mysema.query.apt.QuerydslAnnotationProcessor
而是使用org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
,因为你不必使用query-dsl的@QueryEntity
;)
如果您只有一个具有可选参数的存储库,请考虑对存储库进行子类化(4)
关于java - Spring 数据 : mongodb find query with optional "criterias",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511739/