有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Springdata:mongodb查找查询,带有可选的“标准”

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

我正在使用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);

(一开始我还尝试了$and operator)

但结果并不是我所期望的

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

谢谢


共 (1) 个答案

  1. # 1 楼答案

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

    1. 您可以使用查询dsl来实现这一点。这里有一个不错的教程:http://www.littlelostmanuals.com/2011/09/spring-mongodb-type-safe-queries.html
    2. (等等)再看看这个Jira问题,如果支持这些东西的是春季jpa,那么很快就会出现在mongohttps://jira.spring.io/browse/DATAJPA-209
    3. 您还可以直接使用MongoTemplate类或
    4. 在spring数据中扩展存储库http://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html

    在您的情况下,我将使用查询dsl,因为您必须执行一次,并覆盖所有存储库。(1)

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

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

    的子类。