QueryDSL CaseBuilder не работает с java.util.Date

#hibernate #querydsl

#спящий режим #querydsl

Вопрос:

Когда я это делаю, я получаю сообщение об ошибке java.lang.IllegalArgumentException: Unsupported constant Mon Mar 01 00:00:00 GMT 2021

 DateTimeExpression<Date> startOfMonth = new CaseBuilder()
            .when(order.dueDate.lt(day))
            .then(new Date())
            .otherwise(new Date());
 

Кажется, такой простой запрос. Я не понимаю, что происходит не так.

Я использую QueryDSL 3.6, Hibernate 5.1 и Postgres 10.

Ответ №1:

Проблема в том, что JPQL / HQL не допускает параметров в CASE WHEN выражении. Вы должны заменить константу литералом. Что-то вроде следующего:

 .when(order.dueDate.lt(Expressions.templateExpression(Date.class, "'2021-01-01 00:00:00'"))
 

Константы в выражениях «THEN» и «ELSE» должны быть в порядке.

Комментарии:

1. Если я это сделаю, я получу сообщение об ошибке «ОШИБКА: оператор не существует: временная метка без часового пояса> = текст». Если я добавляю приведение типов, я получаю сообщение об ошибке «org.hibernate.hql.internal.ast.QuerySyntaxException: неожиданный токен : : около строки 6»

2. Вам нужно использовать приведение JPQL вместо приведения SQL. Возможно Expressions.dateOperation(Date.class, JPQLOps.CAST, Expressions.stringTemplate("'2020-01-01'"), Expressions.constant(Date.class)) ?

3. Если я это сделаю, я получу сообщение об ошибке HHH000183: no persistent classes found for query class: