Фильтрация ODATA на DateTimeOffset

Я пытаюсь отфильтровать DateTimeOffset (myDate в приведенных ниже примерах). Поскольку я хочу игнорировать временную часть, я считаю, что единственный способ фильтрации - сравнить отдельно компоненты года, месяца и дня, например.

...entities?$filter=year(myDate) eq 2013

Это также соответствует спецификации ODATA: http://www.odata.org/documentation/odata-v3-documentation/url-conventions/#512412_year

Проблема в том, что это просто не работает:

Caused by: java.lang.UnsupportedOperationException: unsupported expression YearMethodCallExpression
 
at org.odata4j.producer.jpa.JPQLGenerator.toJpql(JPQLGenerator.java:187)
at org.odata4j.producer.jpa.JPQLGenerator.binaryCommonExpressionToJpql(JPQLGenerator.java:309)
at org.odata4j.producer.jpa.JPQLGenerator.toJpql(JPQLGenerator.java:192)
at org.odata4j.producer.jpa.GenerateJPQLCommand.generateJPQL(GenerateJPQLCommand.java:121)&#xd  ;
at org.odata4j.producer.jpa.GenerateJPQLCommand.execute(GenerateJPQLCommand.java:34)
at org.odata4j.producer.jpa.Chain.execute(Chain.java:29)
at org.odata4j.producer.jpa.JPAProducer.getEntities(JPAProducer.java:278)

Если я использую фильтр ниже, я не получаю никакой ошибки, но это не то, что я хочу сделать, потому что часть времени в myDate никогда не бывает в полночь (T00:00:00.000Z), поэтому равенство всегда приводит к False:

...entities?$filter=myDate eq datetimeoffset'2013-09-30T00:00:00.000Z'

Есть идеи? Большое спасибо!


person Gep    schedule 04.11.2013    source источник
comment
Вы реализовали каноническую функцию того года?   -  person tsykora    schedule 04.11.2013


Ответы (1)


Обходной путь для этой проблемы заключается в использовании следующих двух фильтров:

...entities?$filter=myDate ge datetimeoffset'2013-09-30T00:00:00.000Z' и myDate lt datetimeoffset'2013-10-30T00:00:00.000Z'

Я до сих пор не понимаю, почему не работают функции года/месяца/дня.

person Gep    schedule 05.11.2013
comment
когда это произошло? это из-за версии lib? - person RainCast; 05.01.2015
comment
Это работает для OData v2 datetimeoffset'2013-10-30T00:00:00.000Z' это суть. Преобразование year() не работало у меня на v2. - person Abhijeet; 30.03.2017