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

标签 java mongodb querydsl

我的 MongoDB 数据库内的文档有两个主要属性 - header 和有效负载。我的 POJO 将 header 保存为带有键字符串和值字符串的映射。但是,由于我放置的映射限制,我的 header 映射中有一个时间戳字段,该字段由 QueryDSL 作为字符串读取。

如何使用 QueryDSL 比较保存为字符串的时间戳值(长整型)?

我是否应该创建 header 以将键类型字符串映射到值类型对象?如果是这种情况,当返回的路径现在是 SimplePath 而不是允许更复杂比较的 Path(如 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"); 

我已经被困在这个问题上有一段时间了,非常感谢任何帮助。谢谢。

最佳答案

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

这个问题的解决方案是简单地创建我自己的“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;

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

关于java - 使用 QueryDSL 和 Mongo 转换映射值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29068126/

相关文章:

java - 关于java中弱引用的困惑

java - DAO 和数据传输对象

java - 如何使用 CP1250 编码将自定义字体添加到 JFreeChart

linux - 安装mongodb时找不到sudo服务命令

sql - 数据库推荐

python - elasticsearch python 查询 - 按字段分组然后计数

mongodb - 使用Gradle为Spring Data和MongoDB配置QueryDSL

java - 如何使用 Java 使用 REST API 从 HP ALM 获取测试实例?

json - 解析 JSON Nodejs 时出错

java - 当我们有多个表时获取 Querydsl Oracle Rowid