SODA在DB4O中查询JODA DateTime

时间:2012-06-07 14:09:00

标签: java jodatime db4o

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

我的datamodell看起来非常像这样:

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 查询失败。奇怪的是,无论我的数据库中存储了多少对象,evaluate方法只被调用一次。调用candidate的include方法 是的,但候选者不包含在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);

}

}

2 个答案:

答案 0 :(得分:0)

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

否则:

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

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

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

答案 1 :(得分:0)

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

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