Можно ли написать и вызвать пользовательскую функцию в JPQL?
Записать и вызвать пользовательскую функцию в JPQL?
Ответы (2)
Он не поддерживается самой спецификацией JPA, однако некоторые реализации JPA могут предоставлять такое расширение.
Например, в Hibernate вы можете создать подкласс Dialect
< / a> и определите таможенные функции SQL, вызвав registerFunction()
. Многие диалектные функции уже определены таким образом.
Можно ли написать и вызвать пользовательскую функцию в JPQL?
Короткий ответ - нет.
Длинный ответ заключается в том, что на собственные функции нельзя ссылаться в запросах JPQL, поскольку на JPQL как на очень хорошо определенную грамматику. Например, предложение SELECT запроса JPQL определено в спецификации JPA с использованием нотации BNF как:
select_clause :: = SELECT [DISTINCT] select_item {, select_item} *
select_item :: = select_expression [[AS] переменная_результатов]
select_expression :: = single_valued_path_expression | скалярное_выражение | агрегатное_выражение | идентификационная_переменная | ОБЪЕКТ (идентификационная_переменная) | constructor_expression
выражение_конструктора :: = НОВОЕ имя_конструктора (элемент_конструктора {, элемент_конструктора} *)
конструктор_элемент :: = однозначный_путь_выражение | скалярное_выражение | агрегатное_выражение | идентификационная_переменная
агрегатное_выражение :: = {AVG | МАКС | МИН | SUM} ([DISTINCT] выражение_поля_состоянии_путь) | COUNT ([DISTINCT] идентификационная_переменная | State_field_path_expression | single_valued_object_path_expression)
Остальные утверждения определяются аналогичным образом. Можно заметить, что единственными разрешенными функциями являются AVG, MAX, MIN, SUM и COUNT, которые должны встречаться в контексте агрегатного выражения. В грамматике JPQL нет области для пользовательских функций, и, следовательно, необходимо использовать собственные SQL-запросы для вызова пользовательских функций, присутствующих в базе данных.