#java #spring #spring-data-jpa #spring-data
#java #весна #spring-data-jpa #весна-данные
Вопрос:
Предположим, у меня есть следующий код:
Page page = repository.findAll(Entity.class, pageable);
У меня есть особые требования к сортировке, т. Е. Я должен сортировать поля даты и времени только по дате без времени.
Я нашел несколько способов, как это сделать, используя функции postgresql, такие как ‘date_trunc’, но я не хочу использовать этот подход, потому что у меня более сложные правила сортировки, которые сложно реализовать в функциях базы данных.
Мой вопрос: как я могу отсортировать постраничный результат на стороне Java, используя всю мощь данных spring (сортировка классов.Порядок, несколько сортировок одновременно и так далее)
В идеале я хотел написать что-то подобное:
Page page = repository.findAll(Entity.class, pageable);
page.sortWithMap("mySpecificDate", (date) -> truncateToDate(date))
Чего я ожидаю:
Весенние данные сначала сопоставят мою дату с усеченной датой, а затем применят сортировку, указанную в постраничном.
Как это сделать?
или
Как реализовать в спецификациях следующий оператор db:
select date_trunc('day', to_timestamp(1548064880000 / 1000))
где — 1548064880000 — это временная метка из базы данных
Комментарии:
1. но я не хочу прибегать к такому подходу, потому что у меня есть более сложные правила сортировки, которые трудно реализовать в функциях базы данных. Либо вы делаете это на стороне базы данных и получаете достойную производительность, либо в конечном итоге вам придется извлекать ВСЕ СТРОКИ и сортировать их самостоятельно. В JPA нет никакой магии. Он в меру своих возможностей возвращается к собственным механизмам сортировки СУБД.
2. Как результат будет отличаться, если вы сократите временную часть? Я думаю, что это не повлияет на порядок результатов.
3. @Mustafa есть разница, если вы сортируете по двум столбцам, дата с тем же днем будет иметь «как одно значение», а затем сортировка по второму столбцу изменит позиции. Если у вас есть часы и секунды, сортировка по второму столбцу никогда не изменит позиции
4. @Antoniossss обычно я получаю около 20 строк, но я согласен, что это не лучшее решение. На самом деле я пытался это реализовать, но мне не повезло. Если вы знаете, как это реализовать в спецификации: выберите date_trunc(‘day’, to_timestamp({timestamp_from_db} / 1000))
5. @Antoniosssss Я обновил вопрос