如何在 JPA 命名查询的 where 子句中使用 pl/sql 函数?

问题描述 投票:0回答:1

如何在 JPA 命名查询的 where 子句中使用 pl/sql 函数? 我正在使用 JPA/Hibernate 5.2.14。我有一个像这样的命名查询:

        @NamedQuery(name="MyNamedQuery",
                query="SELECT x FROM MyEntity x " +
                        "WHERE x.something = :someParameter " +
                        " AND 1 = my_package.my_function")

pl/sql 函数定义如下:

create or replace package my_package as
  function my_function return number;
  pragma restrict_references(my_function,wnds,wnps);
end;
create or replace package body my_package as
  function my_function return number is
  begin
    return 1;
  end;
end;

当我启动应用程序时,命名查询会导致错误

Caused by: org.hibernate.HibernateException: Errors in named queries: 
MyNamedQuery failed because of: org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'my_package.my_function' [SELECT x FROM MyEntity x WHERE x.something = :someParameter AND 1 = my_package.my_function]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:337)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:460)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:892)
    at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)

有没有办法在 NamedQuery 中使用我的函数?我可以在 sql/developer 中运行底层查询(用实际表名替换 MyEntity 等)。

hibernate jpa plsql
1个回答
0
投票

JPA从2.1版本开始支持存储过程的调用。您可以在此处找到示例。

© www.soinside.com 2019 - 2024. All rights reserved.