我正在使用 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);
}
}