JPA построитель критериев: как заменить и привести строку к числовому в порядке следования? - PullRequest
0 голосов
/ 29 августа 2018

Может, кто-нибудь подскажет, как создать следующий запрос с помощью API построителя JPA Criteria?

SELECT id, name, date, version FROM public.upgradeTable
order by (CAST(replace(version, '.', '')AS numeric)) desc;

Обратите внимание, что в столбце нашей версии есть такие значения, как "11.0.2.213", "11.0.2.73". Нам нужно обрезать символ "." внутри версии, затем приведите их как числовые, а затем отсортируйте по desc.

1 Ответ

0 голосов
/ 30 августа 2018

В настоящее время JPA не имеет API для replace () и cast (строка в виде числа). Но вы можете использовать CriteriaBuilder.function (...) для создания собственных функций базы данных, если переносимость базы данных не критична.

Для MySQL выражение порядка в вашем примере будет:

    Expression<String> replacedValue = criteriaBuilder.function("replace", 
            String.class, root.get("version"), criteriaBuilder.literal("."), 
            criteriaBuilder.literal(""));

    Expression<String> lpadValue = criteriaBuilder.function("lpad", 
            String.class, replacedValue, criteriaBuilder.literal(20),
            criteriaBuilder.literal("0"));

    criteriaQuery.orderBy(criteriaBuilder.desc(lpadValue));

Функция CriteriaBuilder.function (...) не поддерживает такие встроенные функции, как cast(value as type) or convert(value, type). Поэтому используйте lpad (...) для достижения того же порядка по результатам.

Отлично работает с Cmobilecom JPA , легковесной реализацией JPA для Java и Android.

Отказ от ответственности: я являюсь разработчиком Cmobilecom JPA.

...