java - Spring 数据 : mongodb find query with optional "criterias"

标签 java spring mongodb spring-data spring-data-mongodb

休斯顿,我有一个问题(大家好!)。

我正在使用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 问题?

谢谢。

最佳答案

我知道这不是真正的解决方案。

  1. 您可以使用 query-dsl 来完成此任务。这是一个很好的教程:http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html
  2. (等等)另外看看这个 Jira Issue,如果 spring-jpa 中支持此类东西,那么很快就会在 mongo 中支持。 https://jira.spring.io/browse/DATAJPA-209
  3. 您还可以直接使用 MongoTemplate 类或
  4. 通过 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/

相关文章:

node.js - Nodejs Mongodb : findByIdAndUpdate not returning correct error

mongodb - Hbase 数据应该如何才能快速查询响应?

java - android上传文件通过kitkat中提供的存储api打开

java - 使用 PhoneStateListener 打开扬声器

java - 是否有在像 Liferay 这样的 JSR 286 portlet 容器中使用并发后台进程的规定?

java - Spring文件上传未绑定(bind)到模型属性对象

java - 百里香与瓷砖

javascript - 电话应用程序 : Cloud Storage vs Local

Java Scheduler Quartz Cron 触发时间设置

java - HttpHeaders getFirst() 不区分大小写