I need to find entities by date, so I wrote this query annotation over method in JpaRepository
:
@Query(
"select distinct e " +
"from SomeEntity e " +
"join e.someChild c " +
"where e.someField IN :types " +
"and " +
"case " +
"when e.someDate is null then (:month = 12 and :day = 31) " +
"else (month(e.someDate) = :month and day(e.someDate) = :day) " +
"end"
)
List<SomeEntity> findSomeEntities(@Param("month") int monthValue, @Param("day") int dayOfMonth, @Param("types") Set<SomeSubclass> allowed);
Intellij is indicating compilation error between else
and (
: '(', <expression>, <operator>, END, FUNCTION or identifier expected, got '('
. When compiling the following occurs:
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: case near line 1, column 169
Edit:
This is the full anonymized query:
@Query(
//@formatter:off
"select distinct g " +
"from SomeEntity g " +
"join g.chileOne n " +
"join g.childTwo l " +
"join n.childThree ga " +
"where g.someEntityTyp.typ IN :types " +
"and " +
"case " +
"when l.someDate is null then (:month = 12 and :day = 31) " +
"else (month(l.someDate) = :month and day(l.someDate) = :day) " +
"end"
//@formatter:on
)
List<SomeEntity> findSomeEntity(@Param("month") int monthValue, @Param("day") int dayOfMonth, @Param("types") Set<SomeEntityTyp.Typ> relevantSomeEntityTypes);
The error points to the beginning of case
keyword.
Whereas this works fine when someDate
is not null:
@Query(
//@formatter:off
"select distinct g " +
"from SomeEntity g " +
"join g.chileOne n " +
"join g.childTwo l " +
"join n.childThree ga " +
"where g.someEntityTyp.typ IN :types " +
"and month(l.someDate) = :month " +
"and day(l.someDate) = :day")
//@formatter:on
)
List<SomeEntity> findSomeEntity(@Param("month") int monthValue, @Param("day") int dayOfMonth, @Param("types") Set<SomeEntityTyp.Typ> relevantSomeEntityTypes);