【问题标题】:SODA querying for JODA DateTime in DB4O在 DB4O 中 SODA 查询 JODA DateTime
【发布时间】:2012-06-14 17:07:52
【问题描述】:

我正在使用 db4o 和 JODA,但在存储/接收 DateTime 对象时遇到了问题。 至少我认为这是问题所在。

我的数据模型看起来很像这样:

DataFile.class
    enum FileType {...}
    further attributes... (primitve data types)

Product.class extends DataFile.class
    enum ProductType {...}
    further attributes... (primitve data types)

KindOfProduct.class extends Product.class
    DateTime time
    further attributes... (primitve data types)

我正在创建 KindOfProduct 对象并将它们存储在 EmbeddedDatabase 中。 为了查询这些对象,我使用 SODA 并得到了一个 DateTimeComparison.class 实施评估。查询 DateTime 以外的字段可以正常工作,但是 DateTime 查询失败。奇怪的是,评估方法只被调用一次,而不管我的数据库中存储了多少对象。 candidate 的 include 方法被调用 true,但候选对象不包含在 ObjectSet 中。所以似乎某处发生了错误 并且 db4o 退出而不抛出异常(这是评估 SODA 查询的一个已知问题, 从外观上看)。 使用 Eclipse 的 Object Manager Enterprise 插件查询失败。我得到一个 “无法显示结果”错误消息。

我很确定,我已经正确实现了Evaluation 接口(我已经为 与 DateTime 不同的数据类型,它工作正常)。我不认为,我需要实施 TypeHandler 用于存储 DateTime 对象,因为在其他项目中不需要这样做 我的(在那种情况下我使用的是本机查询,但我认为这不是重点)。

那么,关于如何寻找的任何想法?有什么已知的陷阱吗?

编辑:我的评估类代码

import org.joda.time.DateTime;

import com.db4o.query.Candidate;
import com.db4o.query.Evaluation;

public class DateTimeComparison implements Evaluation {

protected enum Operator {

    GREATER, SMALLER, EQUAL

}

private Operator operator = null;
private DateTime value = null;

public DateTimeComparison(String operator, DateTime value) {

    if (operator.equals(">")) {
        this.operator = Operator.GREATER;
    } else {
        if (operator.equals("<")) {
            this.operator = Operator.SMALLER;
        } else {
            this.operator = Operator.EQUAL;
        }
    }
    this.value = value;

}

public void evaluate(Candidate candidate) {

    DateTime dateTime = (DateTime) candidate.getObject();

    boolean match = false;
    switch (operator) {
    case GREATER:
        match = dateTime.compareTo(value) > 0;
        break;
    case SMALLER:
        match = dateTime.compareTo(value) < 0;
        break;
    case EQUAL:
        match = dateTime.compareTo(value) == 0;
        break;
    }
    candidate.include(match);
    System.out.println(match);

}

}

【问题讨论】:

    标签: java jodatime db4o


    【解决方案1】:

    你能展示你的评估代码/类吗?

    否则:

    请注意,评估将“缓慢”,因为不能使用索引。在大型数据集上,这会成为一个问题。

    避免问题的最可靠但丑陋的方法是将常规 Java 日期存储在存储对象中。并将日期字段转换为 getter/setter 中的 JodaTime DateTime。也可以用于查询。

    致类型处理程序:理论上你可以让它工作。一个只存储 DateTime 的简单类型处理程序可能并不难。但是对于高级功能,例如索引类型处理程序是一场噩梦(没有文档,需要将内容转换为内部数据结构等)。

    【讨论】:

    • 我添加了一些代码。奇怪的是,达到了 println,所以我认为我的实现没有问题。我还尝试添加一个类型处理程序,它将 DateTime 存储为 long,但这没有帮助...
    • 嗯,看起来不错。你能发布一个小的工作示例吗?对我来说,这看起来像一个错误。
    【解决方案2】:

    在尝试构建测试用例时,我发现了我的错误。 问题不在于评估,而在于我为查询构建约束的方式。我正在研究一种动态构建这些约束的方法,方法是从 txt 文件中读取它们。我没有考虑到我需要注意约束的链接顺序。例如:(A 和 B)或 C 不等于 A 和(B 或 C)。所以我最终得到了一个不能代表我想要构建的查询的约束。

    我现在正在定义我的约束,然后声明它们应该如何链接,使用反向波兰表示法,所以我不需要关心括号。这似乎工作得很好......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      相关资源
      最近更新 更多