При использовании макросов @dateBefore и @dateAfter ORM округляет параметр

Доброго дня!

При использовании макросов, куда в качестве параметров передаются даты типа Date TemporalType.TIMESTAMP, в нативный запрос эти даты попадают без значения времени.

jpql-запрос

String queryString = "select t from simpledoc$Tasks t join t.executorsAndReports e where t.complited = false and @dateBefore(t.deadLine, :beforeDate) and e.executor = :dep"

параметры

Department dep - сущность
Date beforeDate - дата на n дней больше сегодня. Объявлена так:
Instant instant = Calendar.getInstance().toInstant();
Date beforeDate = new Date(instant.plus(Period.ofDays(remindInDays)).toEpochMilli());

значения:
dep = "FCD6C398-E852-6AF6-2EF1-98BE8E4E45C3"
beforeDate = "2025-05-01 17:55:51.423"

сгенерированный ORM запрос

SELECT t1.ID, t1.ANNOTATION, t1.AUDITED, t1.AUTHOR_REMINDER_DATE, t1.COMPLITED, t1.CONFIDENTIAL, t1.CREATE_TS, t1.CREATED_BY, t1.DEADLINE, t1.DELETE_TS, t1.DELETED_BY, t1.END_DATE, t1.START_DATE, t1.UPDATE_TS, t1.UPDATED_BY, t1.VERSION, t1.ATOMIC_DOC_ID, t1.AUTHOR_ID, t1.CONTACT_ID, t1.CONTRACT_ID, t1.INVOICE_ID, t1.ORDER_ID, t1.PARENT_TASK_ID, t1.R_C_DOC_ID, t1.SHIPMENT_ID FROM SIMPLEDOC_TASK_EXECUTORS_AND_REPORTS t0, SIMPLEDOC_TASKS t1 WHERE (((((t1.COMPLITED = ?) AND (t1.DEADLINE < ?)) AND (t0.EXECUTOR_ID = ?)) AND (t1.DELETE_TS IS NULL)) AND (((t0.TASKS_FOR_EXECUTOR_ID = t1.ID) AND (t0.DELETE_TS IS NULL)) AND (t0.DELETE_TS IS NULL)))

bind => [false, 2025-05-01 00:00:00.0, FCD6C398-E852-6AF6-2EF1-98BE8E4E45C3]

"скриншот значений параметров

image

PS. если заменить макросы в jpql-запросе на простые неравенства, то значение параметров передаются без изменений.

jpql-запрос

String queryString = "select t from simpledoc$Tasks t join t.executorsAndReports e where t.complited = false and t.deadLine < :beforeDate and e.executor = :dep"

сгенерированный ORM запрос

SELECT t1.ID, t1.ANNOTATION, t1.AUDITED, t1.AUTHOR_REMINDER_DATE, t1.COMPLITED, t1.CONFIDENTIAL, t1.CREATE_TS, t1.CREATED_BY, t1.DEADLINE, t1.DELETE_TS, t1.DELETED_BY, t1.END_DATE, t1.START_DATE, t1.UPDATE_TS, t1.UPDATED_BY, t1.VERSION, t1.ATOMIC_DOC_ID, t1.AUTHOR_ID, t1.CONTACT_ID, t1.CONTRACT_ID, t1.INVOICE_ID, t1.ORDER_ID, t1.PARENT_TASK_ID, t1.R_C_DOC_ID, t1.SHIPMENT_ID FROM SIMPLEDOC_TASK_EXECUTORS_AND_REPORTS t0, SIMPLEDOC_TASKS t1 WHERE (((((t1.COMPLITED = ?) AND (t1.DEADLINE < ?)) AND (t0.EXECUTOR_ID = ?)) AND (t1.DELETE_TS IS NULL)) AND (((t0.TASKS_FOR_EXECUTOR_ID = t1.ID) AND (t0.DELETE_TS IS NULL)) AND (t0.DELETE_TS IS NULL)))

bind => [false, 2025-05-01 17:55:51.423, FCD6C398-E852-6AF6-2EF1-98BE8E4E45C3]

Подскажите пожалуйста это нормальное поведение или мы неверно используем макросы?

Обстановка:
Jmix version: 1.6.2
Jmix Studio Plugin Version: 2.5.1-243
IntelliJ version: IntelliJ IDEA 2024.3.2 (Community Edition)
MSSQL/Posgtres

Добрый день, Сергей!

Завел тикет: Macroses @dateBefore and @dateAfter are round time to 0:00 · Issue #4396 · jmix-framework/jmix

Спасибо что подсветили проблему!

1 симпатия