使用QueryDSL和Mongo转换映射值类型

时间:2015-03-16 00:58:12

标签: java mongodb querydsl

我的MongoDB数据库中的文档有两个主要属性 - 标头和有效负载。我的POJO将标题保存为具有键字符串和值字符串的映射。但是,由于我放置了Map限制,我的标题映射中有一个Timestamp字段,由QueryDSL作为String读入。

如何使用QueryDSL比较保存为String的Timestamp值(Long)?

我是否应该创建标题以将键类型字符串映射到值类型对象?如果是这种情况,当返回的路径现在是SimplePath而不是允许更复杂比较的路径(如StringPath或DateTimePath)时,如何执行诸如.startsWith或.contains之类的操作?

我的文档对象:

@Document
public class Event {

    @Id
    private String id; 
    public Map<String, String> headers;
    public Object payload;

创建谓词的方法,该谓词接收标题Map对象并将其与queryDSL的qEvent标题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"); 

我已经坚持了一段时间,任何帮助都会非常感激。谢谢。

1 个答案:

答案 0 :(得分:0)

如果我的问题不明显,我就是在思考它。

这个问题的解决方案是简单地创建我自己的“Headers”对象 - 原始POJO中的嵌套类。

Event类应如下所示:

@Document
public class Event {

    @Id
    private String Id; 
    public Headers headers;
    public Object payload;

在我的Event类中是一个静态Headers对象,其中的字段与我需要的字段相关 - 其​​中一个是“timestamp”。

public static class Headers {

        //some more fields inside my Headers object
        //can be found here

        @Field
        public Long timestamp; 

        @Field
        public Long jms_timestamp; 

        @Field
        public String originator; 

        @Field
        public String eventName;

然后查询谓词的方法保持不变,并且可以相应地比较longs / Strings /任何其他类型。