我無法重現你的問題,這表明問題是與數據庫中的價值觀和你傳遞到查詢中的值(即他們不匹配)。當您嘗試匹配日期時,這並不罕見,因爲您需要確保它們作爲ISODates存儲在數據庫中,並在查詢中使用java.util.date進行查詢。
我有一個測試,顯示您的查詢工作,但我已經做了一些關於您的數據的假設。
我的測試看起來像這樣,希望這會幫助你指出正確的方向,或者如果你給我更多的反饋,我可以更準確地重新創建你的問題。
@Test
public void shouldBeAbleToQuerySpringDataWithDates() throws Exception {
// Setup - insert test data into the DB
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd' 'hh:mm:ss.SSS");
MongoTemplate mongoTemplate = new MongoTemplate(new Mongo(), "TheDatabase");
// cleanup old test data
mongoTemplate.getCollection("ordersAudit").drop();
Release release = new Release("TW", "d");
OrderSnapshot orderSnapshot = new OrderSnapshot(43060151, dateFormat.parse("2013-04-19 12:19:17.165"), release);
OrdersAudit ordersAudit = new OrdersAudit(dateFormat.parse("2013-04-19 12:19:17.165"), orderSnapshot);
mongoTemplate.save(ordersAudit);
// Create and run the query
Date from = dateFormat.parse("2013-04-01 01:00:05.000");
Date to = dateFormat.parse("2014-04-01 01:00:05.000");
Query query = new Query();
query.addCriteria(Criteria.where("orderSnapshot.releases.ffmCenterDesc").is("TW")
.and("orderSnapshot.releases.relStatus").is("d")
.andOperator(
Criteria.where("orderSnapshot.placedTS").gt(from),
Criteria.where("orderSnapshot.placedTS").lt(to)
)
);
// Check the results
List<OrdersAudit> results = mongoTemplate.find(query, OrdersAudit.class);
Assert.assertEquals(1, results.size());
}
public class OrdersAudit {
private Date createdTS;
private OrderSnapshot orderSnapshot;
public OrdersAudit(final Date createdTS, final OrderSnapshot orderSnapshot) {
this.createdTS = createdTS;
this.orderSnapshot = orderSnapshot;
}
}
public class OrderSnapshot {
private long orderId;
private Date placedTS;
private Release releases;
public OrderSnapshot(final long orderId, final Date placedTS, final Release releases) {
this.orderId = orderId;
this.placedTS = placedTS;
this.releases = releases;
}
}
public class Release {
String ffmCenterDesc;
String relStatus;
public Release(final String ffmCenterDesc, final String relStatus) {
this.ffmCenterDesc = ffmCenterDesc;
this.relStatus = relStatus;
}
}
注:
- 這是一個TestNG的類,而不是JUnit的。
- 我用
SimpleDateFormat
創建Java類Date
類,這只是爲了方便使用。
- 您爲relStatus粘貼的XML值包括已剝離的空格。
您向我們展示了XML中的文檔結構,而不是JSON,因此我必須假設您的數據是什麼樣子。我幾乎可以直接翻譯成JSON,所以它看起來像這樣在數據庫:
{
"_id" : ObjectId("51d689843004ec60b17f50de"),
"_class" : "OrdersAudit",
"createdTS" : ISODate("2013-04-18T23:19:17.165Z"),
"orderSnapshot" : {
"orderId" : NumberLong(43060151),
"placedTS" : ISODate("2013-04-18T23:19:17.165Z"),
"releases" : {
"ffmCenterDesc" : "TW",
"relStatus" : "d"
}
}
}
你可以找到你真正的樣子做一個分貝。 <collectionName> .findOne()在mongoDB shell中調用。
什麼是null?查詢變量,還是運行它的結果?如果是運行它的結果,請顯示要查找的電話,例如final list orders = mongoTemplate.find(query,Order.class); 運行查詢不應該返回null,如果沒有找到結果,您將得到一個空列表。 –
Trisha