Можно ли написать и вызвать пользовательскую функцию на JPQL?
Краткий ответ - Нет.
Длинный ответ заключается в том, что собственные функции не могут бытьупоминается в запросах JPQL, как JPQL как очень четко определенная грамматика.Например, предложение SELECT запроса JPQL определено в спецификации JPA с использованием нотации BNF как:
select_clause :: = SELECT [DISTINCT] select_item {, select_item} *
select_item :: = select_expression [[AS] result_variable]
select_expression :: = single_valued_path_expression |scalar_expression |aggregate_expression |опознаваемая переменная |ОБЪЕКТ (идентификационная_ переменная) |constructor_expression
constructor_expression :: = NEW имя конструктора (constructor_item {, constructor_item} *)
constructor_item :: = single_valued_path_expression |scalar_expression |aggregate_expression |variable_variable
aggregate_expression :: = {AVG |Макс |MIN |SUM} ([DISTINCT] state_field_path_expression) |COUNT ([DISTINCT] идентификации_вариабельной | state_field_path_expression | single_valued_object_path_expression)
Другие операторы определяются аналогичным образом.Можно заметить, что единственными разрешенными функциями являются AVG, MAX, MIN, SUM и COUNT, которые должны встречаться в контексте агрегатного выражения.В грамматике JPQL отсутствует область действия для пользовательских функций, и, следовательно, необходимо использовать собственные SQL-запросы для вызова пользовательских функций, присутствующих в базе данных.