#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: