【发布时间】:2015-03-16 00:58:11
【问题描述】:
我的 MongoDB 数据库中的文档有两个主要属性 - 标题和有效负载。我的 POJO 将标头保存为带有键字符串和值字符串的 Map。但是,由于我设置了 Map 限制,我的标头映射中有一个 Timestamp 字段,QueryDSL 将其作为字符串读入。
如何使用 QueryDSL 比较保存为字符串的时间戳值(长整型)?
我是否应该创建我的标头以将键类型 String 映射到值类型 Object?如果是这种情况,当返回的路径现在是 SimplePath 而不是允许更复杂比较的路径(如 StringPath 或 DateTimePath)时,我如何执行 .startsWith 或 .contains 等操作?
我的文档对象:
@Document
public class Event {
@Id
private String id;
public Map<String, String> headers;
public Object payload;
该方法创建一个谓词,该谓词接受一个 headers Map 对象并将其与 queryDSL 的 qEvent headers Map 对象进行比较。
public Predicate createQuery(Map<String, String> headers, Long startTime, Long endTime) {
QEvent qEvent = QEvent.event;
BooleanBuilder builder = new BooleanBuilder();
if (headers != null) {
if (isValid(headers.get("stringID")))
builder.and(qEvent.headers.get("stringID").containsIgnoreCase(headers.get("stringID")));
if (isValid(headers.get("type")))
builder.and(qEvent.headers.get("type").containsIgnoreCase(headers.get("type")));
....
//additional String comparisons on fields inside headers
//this is where the StringPath created by queryDSL suffices for everything except for Long/Timestamp values
return builder.getValue();
}
我已经考虑为时间戳字段创建自己的动态路径,但在以下情况后被卡住了:
PathBuilder<Event> entityPath = new PathBuilder<Event>(Event.class, "entity");
PathBuilder<Timestamp> timestamp = entityPath.getMap("headers", String.class, Timestamp.class).get("timestamp");
以上是正确的开始吗?使用 Mongo 作为我的底层数据库是否意味着上面的第一行实际上应该如下:
PathBuilder<Event> documentPath = new PathBuilder<Event>(Event.class, "document");
我已经坚持了一段时间,任何帮助将不胜感激。谢谢。
【问题讨论】: