我发现使用QueryDSL时生成的查询不能与mongodb一起使用,但它可以与jpa一起使用。 代码是github上项目的一部分。
代码:
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进行测试
答案 0 :(得分:0)
正如Querydsl问题跟踪器中所回答的那样,这看起来像Spring Data Mongodb的Querydsl集成中的一个问题。看起来Spring Data序列化日期与默认的Mongodb Java API日期序列化不同。