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を使用しており、Evaluationを実装するDateTimeComparison.classを取得しました。DateTime以外のフィールドのクエリは正常に機能しますが、DateTimeクエリは失敗します。奇妙なことに、データベースに格納されているオブジェクトの数に関係なく、evaluateメソッドが1回だけ呼び出されます。候補のincludeメソッドはtrueで呼び出されますが、候補はObjectSetに含まれていません。したがって、どこかでエラーが発生し、db4oが例外をスローせずに終了するように見えます(これは、SODAクエリを評価するための既知の問題です)。Eclipse用のObjectManagerEnterpriseプラグインを使用したクエリは失敗します。「結果を表示できません」というエラーメッセージが表示されます。
評価インターフェイスを正しく実装したことは間違いありません(DateTimeとは異なるデータ型に対して同様のことを行ったので、正常に機能します)。他のプロジェクトでは実装する必要がなかったので、DateTimeオブジェクトを格納するためにTypeHandlerを実装する必要があるとは思いません(その場合はネイティブクエリを使用していましたが、それは重要ではないと思います)。
それで、どのように探すかについてのアイデアはありますか?既知の落とし穴はありますか?
編集:私の評価クラスのコード
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);
}
}