Написать и вызвать пользовательскую функцию в JPQL? - PullRequest
1 голос
/ 11 июля 2011

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

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

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

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

1 голос
/ 11 июля 2011

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

...