Я использую db4o и JODA и получил проблему с хранением/получением объектов DateTime. По крайней мере, я думаю, что это была проблема.SODA запрос для JODA DateTime в DB4O
Мой 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)
i'am создания объектов KindOfProduct и хранить их в Встраиваемая СУБД. Для запроса этих объектов я использую SODA и получил DateTimeComparison.class, который реализует оценку. Запрос для полей, отличных от DateTime, работает нормально, но запрос DateTime не выполняется. Странно, что метод оценки вызывается только один раз, независимо от того, сколько объектов хранится в моей базе данных. Метод включения candidate вызывается с true, но кандидат не включен в ObjectSet. Таким образом, кажется, что ошибка встречается где-то , а db4o выходит, не выбрасывая исключение (что является известной проблемой для оценки запросов SODA, по внешнему виду). Выполнение запроса с помощью плагина Enterprise Manager Enterprise для Eclipse не удается. Я получаю сообщение об ошибке «Не отображать результаты» .
Я уверен, что я правильно реализовал интерфейс Evaluation (я сделал аналогичный для другой тип данных, чем DateTime, и он отлично работает). Я не думаю, что мне нужно реализовать объект TypeHandler для хранения объектов DateTime, поскольку не нужно было делать это в другом проекте (я использовал собственные запросы в этом случае, но я думаю, что это не так) ,
Итак, любые идеи о том, как искать? Любые известные подводные камни?
EDIT: код моего класса оценки
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);
}
}
Я добавил код. Странно, что println добирается, поэтому я думаю, что нет ничего плохого в моей реализации. Я также попытался добавить обработчик типа, который хранит DateTime как длинный, но это не помогло ... – suez
Хм, отлично выглядит. Можете ли вы опубликовать небольшой рабочий пример? Для меня это похоже на ошибку. – Gamlor