我正在使用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);
}
}
答案 0 :(得分:0)
您能展示您的评估代码/课程吗?
否则:
请注意,评估将“缓慢”,因为无法使用索引。在大型数据集上,这成为一个问题。
最可靠,最丑陋的方法是避免在存储对象中存储常规Java Date的问题。并将Date字段转换为getter / setter中的JodaTime DateTime。在查询中也是如此。
对于打字机:理论上你可以使它工作。一个只存储DateTime的简单类型处理程序可能并不那么难。但是对于高级功能,像索引类型处理程序是一场噩梦(没有文档,需要将内容转换为内部数据结构等)。
答案 1 :(得分:0)
在尝试构建测试用例时,我发现了错误。 问题不是评估,而是我如何构建查询约束的方式。我正在研究一种通过从txt文件中读取它们来动态构建这些约束的方法。我不知道我需要注意约束的关联顺序。例如:(A和B)或C不等于A和(B或C)。所以我最终得到的约束并没有代表我想构建的查询。
我现在正在定义我的约束,然后使用反向波兰表示法声明它们应该如何链接,所以我不需要关心括号。这似乎工作得很好......