0

我收到错误“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,列“客户端”,我希望它通过我定义的处理程序,但它没有 - 当我使用它所做的参数处理程序进行插入时(它是相同的处理程序,但不同的方法)

请问有什么想法吗?

4

0 回答 0