【问题标题】:Write & Call user-defined function in JPQL?在 JPQL 中编写和调用用户定义的函数?
【发布时间】:2011-07-11 08:30:26
【问题描述】:

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

【问题讨论】:

    标签: jpa jpql user-defined-functions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      是否可以在 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 | 标量表达式 |聚合表达式 |识别变量 | 对象(标识变量)|构造函数表达式

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

      constructor_item ::= single_valued_pa​​th_expression |标量表达式 |聚合表达式 |识别变量

      聚合表达式 ::= { AVG |最大 |最小 |总和}([不同] state_field_path_expression) |计数([不同] 识别变量 | state_field_path_expression | 单值对象路径表达式)

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

      【讨论】:

        猜你喜欢
        • 2019-02-10
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多