【问题标题】:Converting Map Value Type with QueryDSL and Mongo使用 QueryDSL 和 Mongo 转换 Map 值类型
【发布时间】: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"); 

我已经坚持了一段时间,任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java mongodb querydsl


    【解决方案1】:

    如果我的问题不是很明显,那是我想多了。

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

    Event 类应该如下:

    @Document
    public class Event {
    
        @Id
        private String Id; 
        public Headers headers;
        public Object payload;
    

    在我的 Event 类中是一个静态 Headers 对象,其中包含与我需要的字段相关的字段 - 其中之一是“时间戳”。

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 2021-10-18
      • 2018-11-02
      • 1970-01-01
      • 2018-03-22
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      相关资源
      最近更新 更多