【发布时间】:2011-07-11 08:30:26
【问题描述】:
是否可以在 JPQL 中编写和调用用户定义的函数?
【问题讨论】:
标签: jpa jpql user-defined-functions
是否可以在 JPQL 中编写和调用用户定义的函数?
【问题讨论】:
标签: jpa jpql user-defined-functions
JPA 规范本身不支持它,但是,一些 JPA 实现可能会提供这样的扩展。
例如,在 Hibernate 中,您可以继承 Dialect 并通过调用 registerFunction() 定义自定义 SQL 函数。许多特定方言的函数已经以这种方式定义。
【讨论】:
是否可以在 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_path_expression | 标量表达式 |聚合表达式 |识别变量 | 对象(标识变量)|构造函数表达式
constructor_expression ::= NEW constructor_name (constructor_item {, constructor_item}* )
constructor_item ::= single_valued_path_expression |标量表达式 |聚合表达式 |识别变量
聚合表达式 ::= { AVG |最大 |最小 |总和}([不同] state_field_path_expression) |计数([不同] 识别变量 | state_field_path_expression | 单值对象路径表达式)
其他语句的定义方式类似。可以注意到,唯一允许的函数是 AVG、MAX、MIN、SUM 和 COUNT,它们必须出现在聚合表达式的上下文中。 JPQL 语法中没有用户定义函数的范围,因此,必须使用原生 SQL 查询来调用数据库中存在的用户定义函数。
【讨论】: