Я использую Google App Engine для Java с интерфейсом JDO для хранилища данных для приложения для организации CrimeWatch. Одна из функций, которую я пытаюсь реализовать, - это журнал посещений, где люди сообщают, когда они собираются отсутствовать в течение длительного периода времени (поэтому патрули знают, что следят за домами). В приложении у меня есть объект AwayLogEntry с начальной и конечной датой, а также другие необходимые поля.
Мне нужно сделать отчет доступным для людей, которые патрулируют окрестности тех, кто отсутствует в данный период времени (обычно в предстоящую неделю). Я пытаюсь создать отчет, который с учетом двух дат находит все AwayLogEntries, которые перекрываются с этим диапазоном.
Запрос, который я действительно хочу использовать:
select * from AwayLogEntry where not(end < :reportStartDate || start > :reportEndDate)
однако предложение NOT недопустимо (не удалось найти документацию по этому поводу, но оно вызвало исключение), а также не использует два поля с фильтрами неравенства , поэтому я не могу просто запросить для разных случаев перекрытия напрямую.
Мой обходной путь на данный момент невелик - я собираюсь сделать ежедневную работу cron, которая удаляет (или помечает их, если мне нужно сохранить их для аудита), удаляя записи журнала, когда текущая дата больше, чем конец записей Дата. Затем я могу запросить все записи, чья дата начала меньше даты окончания отчета (и не помечается, если я не удаляю их). Это позволит разумно сообщать о записях за следующие X дней (что обычно требуется), но не разрешает произвольные запросы в диапазоне дат (которые, я предполагаю, они будут запрашивать), если только я вытащите все записи и отфильтруйте их в коде.
Может кто-нибудь придумать какие-нибудь хитрости, чтобы обойти это ограничение реализации GAE JDO?