Как использовать подстроку с построителем критериев - PullRequest
0 голосов
/ 03 сентября 2018

Я хочу преобразовать строку 11.0.3.200 в 0011.0000.0003.0200 для сортировки этой строки по убыванию.

Expression<String> majorVer = cb.function("SUBSTRING_INDEX", String.class, uf.get(sortAttr), cb.literal("."), cb.literal(1)); //11      
Expression<String> lpadMajorValue = cb.function("lpad", String.class, majorVer, cb.literal(4), cb.literal("0"));

Expression<String> minorVerBase = cb.function("REPLACE", String.class, uf.get(sortAttr), cb.concat(majorVer, cb.literal(".")), cb.literal(""));//0.3.200      
Expression<String> minorVer = cb.function("SUBSTRING_INDEX", String.class, minorVerBase, cb.literal("."), cb.literal(1)); //0
 Expression<String> lpadMinorValue = cb.function("lpad", String.class, minorVer, cb.literal(4), cb.literal("0"));

Expression<String> buildVerBase = cb.function("REPLACE", String.class, minorVerBase, cb.concat(minorVer, cb.literal(".")), cb.literal("")); //3.200
Expression<String> buildVer = cb.function("SUBSTRING_INDEX", String.class, buildVerBase, cb.literal("."), cb.literal(1)); //3
Expression<String> lpadBuildValue = cb.function("lpad", String.class, buildVer, cb.literal(4), cb.literal("0"));

Expression<String> revVer = cb.function("REPLACE", String.class, buildVerBase, cb.concat(buildVer, cb.literal(".")), cb.literal("")); //200
Expression<String> lpadRevisionValue = cb.function("lpad", String.class, revVer, cb.literal(4), cb.literal("0"));

Expression<String> lpadValue = cb.concat(lpadMajorValue, cb.concat(lpadMinorValue, cb.concat(lpadBuildValue, lpadRevisionValue)));

 orderList.add(cb.desc(lpadValue));

Но я получаю исключение:

nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; 
nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause
org.postgresql.util.PSQLException: ERROR: function substring_index(text) does not exist"

Любое предложение, если я делаю что-то не так с SUBSTRING_INDEX, используйте для построения критериев. Если SUBSTRING_INDEX не поддерживается разработчиком критериев, что является альтернативой?

1 Ответ

0 голосов
/ 04 сентября 2018

В разделе 4.6.17.2 спецификации JPA 2.2 перечислены функции, доступные в JPA, и он не включает SUBSTRING_INDEX. Я думаю, можно с уверенностью предположить, что более ранние версии также не включают его. Поэтому JPA не сможет перевести его в какую-то конкретную базу данных.

Это также не является частью SQL диалекта Postgres. Так что простое прохождение тоже не работает, как вы заметили.

К счастью, JPA знает о LOCATE, что звучит как то, что вы ищете.

Из спецификации:

Функция LOCATE возвращает позицию заданной строки в строке, начиная поиск в указанной позиции. Возвращает первую позицию, в которой строка была найдена как целое число. Первый аргумент - это строка, которую нужно найти; второй аргумент - это строка для поиска; необязательный третий аргумент - это целое число, представляющее позицию строки, с которой начинается поиск (по умолчанию - начало строки, в которой выполняется поиск). Первая позиция в строке обозначена 1. Если строка не найдена, возвращается 0.

...