java - 如何处理来自@Entity 类上定义的 Java Spring Data JPA @NamedStoredProcedureQuery 的 2 个 OUT 用户定义的自定义数据类型?
问题描述
更新:
我已经尝试为我的类型定义的我的和Java POJO实现SQLData
接口。我还根据 Oracle 文档
实现了所需的、 和方法: https ://docs.oracle.com/cd/A97335_02/apps.102/a83724/samapp6.htmFinancial.class
PersonalInfo.class
@NamedStoredProcedureQuery
getSQLTypeName
readSQL
writeSQL
我希望这会起作用,但看起来它仍然给了我同样的Type cannot be null
例外。我的 Oracle DB 中定义的这些personal_information_t
和financial_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_data
schema/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);
}
- 我的
type = "*.class"
声明在@NamedStoredProcedureQuery
注释上是否正确?似乎我的 Types are 被读取为空。我在我的代码中创建了一个PersonalInfo.java
和Financial.java
@Entities
,因为我希望它会从 Oracle 用户定义的类型映射,但它似乎不起作用。 - 在我的所有文件
@Entities
中,我必须声明一些元信息,@Table(schema = "JJR", name = "MY_TABLE_NAME")
因为如上所述,我正在登录我的 Oracle DB 中的特定用户/模式。我也需要把它放在@NamedStoredProcedureQuery 上吗?不过,从技术上讲,我并没有映射到这里的表(我只需要来自两个 OUT 参数的数据)。 - 我什至尝试
java.sql.Struct.class
在 per Google 中用作类型@NamedStoredProcedureQuery
,但似乎没有任何效果。 - 我需要在带有注释的
Employee
实体中定义哪些列/字段?@NamedStoredProcedureQuery
我并没有真正映射到表,就像我们通常使用@Entity 一样。这个存储过程只是返回这两个 OUT 参数(personal_information_t
并且financial_t
我需要它的数据)。Employee 类中的字段是否应该只是我需要的 Oracle 用户定义类型中的字段?
解决方案
推荐阅读
- javascript - 如何在 D3 Js 中将 y 轴(yDomain)值设置为最大值
- r - 从 R 中的数据框创建相关矩阵
- reactjs - 在同一个文件中同时添加命名组件和默认组件是否合法?
- r - 使用 pacman 在 Ubuntu 中安装 R 包时出现依赖项错误
- python - sqlite python - 从txt文件将记录读入表
- python - 如何从两个列表中创建堆叠条形图:考虑一个是集群,另一个是标志
- c# - 如果特定值在行内,则更改行中的背景颜色
- javascript - Express 服务器在使用大字符串进行 post/put 请求时发送 500 错误代码
- kubernetes - 普罗米修斯可以一起刮目标吗?
- node.js - 如何使用 node.js 更改带有 GCP Cloud Function 的 VM/实例标签?