Записать и вызвать пользовательскую функцию в JPQL?

Можно ли написать и вызвать пользовательскую функцию в JPQL?


person Muhammad Hewedy    schedule 11.07.2011    source источник


Ответы (2)


Он не поддерживается самой спецификацией JPA, однако некоторые реализации JPA могут предоставлять такое расширение.

Например, в Hibernate вы можете создать подкласс Dialect < / a> и определите таможенные функции SQL, вызвав registerFunction(). Многие диалектные функции уже определены таким образом.

person axtavt    schedule 11.07.2011

Можно ли написать и вызвать пользовательскую функцию в 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-запросы для вызова пользовательских функций, присутствующих в базе данных.

person Vineet Reynolds    schedule 11.07.2011