首页 > 解决方案 > 如何处理来自@Entity 类上定义的 Java Spring Data JPA @NamedStoredProcedureQuery 的 2 个 OUT 用户定义的自定义数据类型?

问题描述

更新: 我已经尝试为我的类型定义的我的和Java POJO实现SQLData接口。我还根据 Oracle 文档 实现了所需的、 和方法: https ://docs.oracle.com/cd/A97335_02/apps.102/a83724/samapp6.htmFinancial.classPersonalInfo.class@NamedStoredProcedureQuerygetSQLTypeNamereadSQLwriteSQL

我希望这会起作用,但看起来它仍然给了我同样的Type cannot be null例外。我的 Oracle DB 中定义的这些personal_information_tfinancial_t对象是否继承自一个名为的超类是否重要base_t


大家好,我只是想@NamedStoredProcedureQuery直接在我的@Entity班级上使用 来调用我的 Oracle 数据库中的存储过程(即在单独的模式中"JJR")。我确实可以从我的 Java Spring Boot 应用程序以编程方式正确连接到该数据库,并且我可以成功运行 JPA 查询,.findAll()所以我知道这不是连接问题,但我相信与我的 @NamedStoredProcedure 声明有关。Google 上针对 Spring JPA 存储过程查询的所有教程都使用标准数据类型,如 Long 或 String,并且只返回一个OUT 参数。

但是,我返回两个 OUT 参数并使其更复杂,它们是用户定义的类型(在 Oracle 数据库中定义),所以我试图弄清楚如何处理这个问题,因为我当前的尝试是返回这个例外:

org.springframework.dao.InvalidDataAccessApiUsageException: Type cannot be null; nested exception is java.lang.IllegalArgumentException: 

我的存储过程结构(它在我的 oracle db 的pkg_employee_dataschema/user 中的 Package 内JJR)。用户定义的类型(personal_information_t并且financial_t两者都有多个字段,即personal_information_t有一个userid、firstname、lastname,而financial_t有salary、networth等:

PROCEDURE get_employee_data (
            empid      IN       emp.emp_id%TYPE, // NUMBER(38,0)
            persinfo   OUT      personal_information_t, // user-defined type
            financ     OUT      financial_t / user-defined type

   );

以及我如何定义@NamedStoredProcedureQuery

@Entity
@NamedStoredProcedureQuery(name = "Employee.getEmployeeData",
        procedureName = "pkg_employee_data.get_employee_data", parameters = {
        @StoredProcedureParameter(mode = ParameterMode.IN, name = "empid", type = Long.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "persinfo", type = PersonalInfo.class),
        @StoredProcedureParameter(mode = ParameterMode.OUT, name = "financ", type = Financial.class)})
public class Employee {

    // Should I list the columns I want mapped here in the Entity 
    // from the "persinfo" and "financ" user-defined types, that 
    // should have a bunch fields/data inside them?
    @Id
    private long userId;
    private String firstName;
    private Double salary;

}

还有@Repository声明,我在其中映射此方法:

@Repository
public interface EmployeeRepository extends JpaRepository<Employee,Long> {

    @Procedure(name = "Employee.getEmployeeData")
    Map<String, Object> getEmployee(@Param("empid") long empid);
}

  1. 我的type = "*.class"声明在@NamedStoredProcedureQuery注释上是否正确?似乎我的 Types are 被读取为空。我在我的代码中创建了一个PersonalInfo.javaFinancial.java @Entities,因为我希望它会从 Oracle 用户定义的类型映射,但它似乎不起作用。
  2. 在我的所有文件@Entities中,我必须声明一些元信息,@Table(schema = "JJR", name = "MY_TABLE_NAME")因为如上所述,我正在登录我的 Oracle DB 中的特定用户/模式。我也需要把它放在@NamedStoredProcedureQuery 上吗?不过,从技术上讲,我并没有映射到这里的表(我只需要来自两个 OUT 参数的数据)。
  3. 我什至尝试java.sql.Struct.class在 per Google 中用作类型@NamedStoredProcedureQuery,但似乎没有任何效果。
  4. 我需要在带有注释的Employee实体中定义哪些列/字段?@NamedStoredProcedureQuery我并没有真正映射到表,就像我们通常使用@Entity 一样。这个存储过程只是返回这两个 OUT 参数(personal_information_t并且financial_t我需要它的数据)。Employee 类中的字段是否应该只是我需要的 Oracle 用户定义类型中的字段?

标签: javaspringjpastored-proceduresspring-data-jpa

解决方案


推荐阅读