将QueryDSL与MongoDB一起使用时无效的查询

时间:2014-06-24 09:29:04

标签: spring-data-mongodb querydsl

我发现使用QueryDSL时生成的查询不能与mongodb一起使用,但它可以与jpa一起使用。 代码是github上项目的一部分。

该方法位于https://github.com/corneil/spring-data-demo/blob/master/src/main/java/org/springframework/data/demo/service/LocationAndDeviceServiceImpl.java

代码:

private List<LocationUpdate> findLocationsFunctions(String deviceId, Date startDate, Date endDate) {
    logger.info("findLocations:" + deviceId + "," + startDate + "," + endDate);
    DeviceInfo device = deviceInfoRepository.findByDeviceId(deviceId);
    if (device == null) {
        throw new DataRetrievalFailureException("DeviceInfo:" + deviceId);
    }
    return locationUpdateRepository.findByDeviceAndLocTimeBetween(device, startDate, endDate);
}
private List<LocationUpdate> findLocationsQsl(String deviceId, Date startDate, Date endDate) {
    logger.info("findLocations:" + deviceId + "," + startDate + "," + endDate);
    DeviceInfo device = deviceInfoRepository.findByDeviceId(deviceId);
    if (device == null) {
        throw new DataRetrievalFailureException("DeviceInfo:" + deviceId);
    }
    List<LocationUpdate> result = new ArrayList<LocationUpdate>();
    Iterable<LocationUpdate> resultSet = locationUpdateRepository
            .findAll(locationUpdate.device.eq(device).and(locationUpdate.locTime.between(startDate, endDate)));
    for (LocationUpdate loc : resultSet) {
        result.add(loc);
    }
    return result;
}
public List<LocationUpdate> findLocations(String deviceId, Date startDate, Date endDate) {
    return findLocationsFunctions(deviceId, startDate, endDate);
    // return findLocationsQsl(deviceId, startDate, endDate);
}

在评论findLocationsFunctions并取消注释findLocationsQsl时,您将能够引发问题。 项目中的常规测试将使用嵌入式H2执行JPA代码。 您将需要访问mondodb来执行mongo配置文件的测试。 database.properties文件包含mongodb url。 代码:

./gradlew test testMongo

我认为问题在于如何在Mongo Query中转换QueryDSL谓词。 当我最初做mongoTemplate时。 代码:

List<LocationUpdate> locations = mongoTemplate .find(
   query(where("device").is(device).and("locTime").gte(startDate)
   .and("locTime").lte(endTime)), LocationUpdate.class);

它给出了一个例外&#39;由于BasicDBObject的限制,你不能再添加第二个和&#34;并且不得不改为:

代码:

List<LocationUpdate> locations = mongoTemplate .find(
   query(where("device").is(device).andOperator(
       where("locTime").gte(startDate),
      where("locTime").lte(endTime))), LocationUpdate.class);

我注意到使用finder方法时会出现以下内容:

代码:

"locTime" : { 
    "$gt" : { "$date" : "2014-04-02T14:06:23.600Z"} , 
    "$lt" : { "$date" : "2014-04-02T14:06:23.931Z"}
}

findLocationsQsl中的代码不会呈现与locTime相关的任何条件。

使用Spring Data MongoDB 1.5.0和QueryDSL 3.3.4进行测试

1 个答案:

答案 0 :(得分:0)

正如Querydsl问题跟踪器中所回答的那样,这看起来像Spring Data Mongodb的Querydsl集成中的一个问题。看起来Spring Data序列化日期与默认的Mongodb Java API日期序列化不同。