我收到错误“20:13:20.156 INFO org.ssc.gss.service.TestServiceTest - org.springframework.jdbc.UncategorizedSQLException org.springframework.jdbc.UncategorizedSQLException:查询数据库时出错。原因:java.sql.SQLException:ORA- 29478:" 虽然我已经定义了结果映射类型处理程序。它完全忽略了我的处理程序
这是我关于表和类型的 Oracle 代码:
CREATE TABLE CLIENTS (
ID NUMBER ,
NAME VARCHAR2(40) unique,
DESCRIPTION VARCHAR2(200),
CONSTRAINT CLIENT_PK PRIMARY KEY (ID) USING INDEX ENABLE
)
/
CREATE TABLE DELIVERABLES (
ID NUMBER ,
NAME varchar2(30),
CLIENTID NUMBER,
DESCRIPTION VARCHAR2(200)
)
/
CREATE TYPE BASEENTITYTYPE IS OBJECT
(
ID NUMBER,
NAME VARCHAR2(30),
DESCRIPTION VARCHAR2(200)
);
/
这是我关于函数和存储过程的 Oracle 定义:
CREATE OR REPLACE FUNCTION get_base_details(
i_p_id IN number,
i_p_type IN VARCHAR2
) return BASEENTITYTYPE
IS
o_detail BASEENTITYTYPE;
BEGIN
o_detail := BASEENTITYTYPE(i_p_id, null, null);
BEGIN
CASE
WHEN UPPER(i_p_type) = 'CLIENT'
THEN
SELECT NAME, DESCRIPTION INTO o_detail.NAME, o_detail.DESCRIPTION FROM CLIENTS where ID = o_detail.id;
END case;
END;
return o_detail;
END;
/
CREATE OR REPLACE PROCEDURE TEST_GET_BASEDETAILS
AS
c1 SYS_REFCURSOR;
BEGIN
OPEN c1 for
SELECT d.name, d.DESCRIPTION, get_base_details(d.clientID,'CLIENT') client FROM deliverables d;
DBMS_SQL.RETURN_RESULT(c1);
END;
/
要填充数据:
INSERT INTO CLIENTS(ID, NAME, description) values (1, 'A','AAA');
INSERT INTO CLIENTS(ID, NAME, description) values (2, 'B','bbb');
insert into deliverables values(1,'D1',1, 'CCC');
如果我在 sqlplus 命令行中运行如下:
exec TEST_GET_BASEDETAILS()
我可以得到如下结果:
NAME | DESCRIPTION | CLIENT(ID, NAME, DESCRIPTION)
--------------------------------------------------------------------------------
D1 | CCC | BASEENTITYTYPE(1, 'A', 'AAA')
这是我的Java:
基本实体:
@Data
public class BaseEntity {
private Long id;
private String name;
private String description;
}
测试实体:
@Data
public class TestEntity {
private String name;
private String[] filename;
private BaseEntity client;
}
映射器.java
@Mapper
public interface TestMapper {
List<TestEntity> getAll();
}
映射器.xml:
<resultMap id="TestEntity" type="org.ssc.gss.entity.TestEntity">
<result property="client" column="client" typeHandler="org.ssc.gss.utils.OracleBaseEntityHandler" javaType="org.ssc.gss.entity.TestEntity"/>
</resultMap>
<select id="getAll" statementType="CALLABLE" resultMap="TestEntity" >
call TEST_GET_BASEDETAILS()
</select>
因为我已经为结果映射分配了 typeHandler,列“客户端”,我希望它通过我定义的处理程序,但它没有 - 当我使用它所做的参数处理程序进行插入时(它是相同的处理程序,但不同的方法)
请问有什么想法吗?