写作&在JPQL中调用用户定义的函数?

时间:2011-07-11 08:30:26

标签: jpa jpql user-defined-functions

是否可以写&在JPQL中调用用户定义的函数?

2 个答案:

答案 0 :(得分:2)

JPA规范本身并不支持它,但是,一些JPA实现可能会提供这样的扩展。

例如,在Hibernate中,您可以继承Dialect并通过调用registerFunction()来定义海关SQL函数。许多方言特定的功能已经以这种方式定义。

答案 1 :(得分:1)

  

是否可以写&在JPQL中调用用户定义的函数?

简短回答 - 否。

很长的答案是,JPQL查询中不能引用本机函数,因为JPQL是一个非常明确的语法。例如,JPQL查询的SELECT子句在JPA规范中使用BNF表示法定义为:

  

select_clause :: = SELECT [DISTINCT] select_item {,select_item} *

     

select_item :: = select_expression [[AS] result_variable]

     

select_expression :: = single_valued_pa​​th_expression |   scalar_expression | aggregate_expression | identification_variable |   OBJECT(identification_variable)| constructor_expression

     

constructor_expression :: = new constructor_name(constructor_item {,   constructor_item} *)

     

constructor_item :: = single_valued_pa​​th_expression | scalar_expression   | aggregate_expression | identification_variable

     

aggregate_expression :: = {AVG | MAX | MIN | SUM}([DISTINCT]   state_field_path_expression)| COUNT([DISTINCT]   identification_variable | state_field_path_expression |   single_valued_object_path_expression)

其他陈述以类似方式定义。可以注意到,唯一允许的函数是AVG,MAX,MIN,SUM和COUNT,它们必须出现在聚合表达式的上下文中。 JPQL语法中没有用户定义函数的作用域,因此,必须使用本机SQL查询来调用数据库中存在的用户定义函数。