Java Springdata:mongodb查找查询,可选;“标准”;

Java Springdata:mongodb查找查询,可选;“标准”;,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,休斯顿,我有个问题(大家好!) 我正在使用springdata的@query注释,我需要使用一些标准执行查找查询 假设我的集合对象类似于: 代码 日期 钥匙 帐户{email,firstname,lastname} 地位 我的搜索条件对象是 代码 日期 钥匙 电子邮件 地位 我需要在集合中搜索符合条件的文档 问题是搜索条件不是强制性的,所以我可以有一些空参数(例如,有时我必须查找带有特定代码和日期的文档,有时带有特定电子邮件等),所以我开始用谷歌搜索解决方案 我读过关于$or和$and操

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

我正在使用springdata的@query注释,我需要使用一些标准执行查找查询

假设我的集合对象类似于:

  • 代码
  • 日期
  • 钥匙
  • 帐户{email,firstname,lastname}
  • 地位
我的搜索条件对象是

  • 代码
  • 日期
  • 钥匙
  • 电子邮件
  • 地位
我需要在集合中搜索符合条件的文档

问题是搜索条件不是强制性的,所以我可以有一些空参数(例如,有时我必须查找带有特定代码和日期的文档,有时带有特定电子邮件等),所以我开始用谷歌搜索解决方案

我读过关于$or和$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);
@Query(value=“{date:{$exists:false},key:?0,$or:[{$or:[{$where:''1==null'},{$code:?1}]},{$or:[{$where:''2==null'},{状态:?2}]}”)
公共页面findByNotificationCriteria(可分页页面、字符串键、字符串代码、字符串状态);
(一开始我还尝试了$and运算符)

但结果并不是我所期望的

我做错了什么,还是只是springdata的问题


谢谢。

我知道这不是一个真正的解决办法

  • 您可以使用查询dsl来实现这一点。这里有一个不错的教程:
  • (等等)再看看这个Jira问题,如果对这些事情的支持是在春季jpa,那么很快就会在mongo
  • 您还可以直接或直接使用
    MongoTemplate
  • 用spring数据扩展您的存储库 在您的情况下,我将使用查询dsl,因为您必须执行一次并覆盖所有存储库。(一)

    注意:为了让它更好一点,不要使用
    com.mysema.query.apt.QuerydslAnnotationProcessor
    ,而是使用
    org.springframework.data.mongodb.repository.support.MongoAnnotationProcessor
    ,因为您不必使用查询dsl的
    @QueryEntity
    ;)


    如果你只有一个存储库,在那里你有可选的参数,考虑到子库(4)

    的子类。如果你的查询逻辑很复杂,你可以通过直接使用代码来创建查询,而不是使用@查询注释,这样会更好。感谢这些信息,它们非常有用。最后,我使用了mongo模板(我已经知道了逻辑,没有那么多时间来实现新的东西)。一切正常。我希望如此。作为附录:顺便提一下,还有一些情况下你不能使用查询dsl,而必须处理MongoTemplate:我想还有更多这样的事情。。。