0

我正在使用 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 查询失败。奇怪的是,评估方法只被调用一次,而不管我的数据库中存储了多少对象。候选人的 include 方法被调用为 true,但候选人不包含在 ObjectSet 中。因此,似乎某处发生了错误,db4o 退出而没有抛出异常(从外观上看,这是评估 SODA 查询的一个已知问题)。使用 Eclipse 的 Object Manager Enterprise 插件查询失败。我收到“无法显示结果”错误消息。

我很确定,我已经正确地实现了评估接口(我对与 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);

}

}
4

2 回答 2

0

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

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

于 2012-06-11T13:55:30.660 回答
0

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

否则:

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

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

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

于 2012-06-08T00:39:35.317 回答