【问题标题】:SQLData reading mapped objects with an interfaceSQLData 使用接口读取映射对象
【发布时间】:2020-09-05 17:24:54
【问题描述】:

简介

我正在创建一个从 OracleSQL 数据库上的映射对象读取的接口。到目前为止一切顺利,我成功创建了 TYPE 和 TABLE,但是当使用 java.sql.SQLData 阅读它们时,它给了我这个转换错误。

代码

public class EmpresaSqlData extends Empresa implements SQLData {

    private String sql_type = "USER.EMPRESA";

    public EmpresaSqlData() {}

    public EmpresaSqlData(String cif, String nom, Contacte contacte) {
        super(cif, nom, contacte);
    }    

    public EmpresaSqlData(String cif, String nom) {
        super(cif, nom);
    }

    @Override
    public String getSQLTypeName() throws SQLException {
        return sql_type;
    }

    @Override
    public void readSQL(SQLInput stream, String typeName) throws SQLException {
        sql_type = typeName;
        setNom(stream.readString());
        setCif(stream.readNString());//Write the object
        setContacte(stream.readObject(new Contacte)); //Fix??
    }

    @Override
    public void writeSQL(SQLOutput stream) throws SQLException {
        stream.writeString(getNom());
        stream.writeString(getCif());
        stream.writeObject(new ContacteSqlData());        
    }    
}

当我执行以下查询时需要以上内容:

@Override
    public List<EmpresaSqlData> findAll() {
        EmpresaSqlData empresaSqlDataSQLData;
        List<EmpresaSqlData> corpList = new ArrayList<>();
        String query = "SELECT VALUE (e) FROM empreses e";

       try (Connection conn = cf.getConnection();
             PreparedStatement statement 
                    = conn.prepareStatement(query);){

            //Initial connection setup
            conn.setTypeMap(map);

            ResultSet rs = statement.executeQuery();


            while (rs.next()){      
                System.out.println(rs.getObject(1, EmpresaSqlData.class)); //Error here "Type of column not valid"
            }            

            return corpList;              

        } catch (SQLException e) {
            Logger.getLogger(EmpresaDAOImpl.class.getName()).log(Level.SEVERE, null, e);
            return null;
        }
    }

研究

来自docs 在“实现 readSQL() 和 writeSQL() 方法”(Ctrl+C 和 Ctrl+F + Enter 进入重点)它指出:

· The readSQL() method takes as input a SQLInput stream and a string that indicates the SQL type name of the data (in other words, the name of the Oracle object type, such as EMPLOYEE)

问题

然后我尝试读取readSQL()返回的SQLobject并将其转换为Java对象Contacte

setContacte((Contacte)stream.readObject());

这给了我这个例外:

Exception in thread "main" java.lang.ClassCastException: oracle.sql.STRUCT cannot be cast to activitat3.logica.Contacte
    at activitat3.logica.EmpresaSqlData.readSQL(EmpresaSqlData.java:44)
    at oracle.sql.STRUCT.toClass(STRUCT.java:662)
    at oracle.sql.STRUCT.toJdbc(STRUCT.java:599)
    at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:140)
    at oracle.jdbc.driver.NamedTypeAccessor.getObject(NamedTypeAccessor.java:110)
    at oracle.jdbc.driver.GeneratedStatement.getObject(GeneratedStatement.java:261)
    at oracle.jdbc.driver.GeneratedScrollableResultSet.getObject(GeneratedScrollableResultSet.java:761)
    at activitat3.dades.impl.EmpresaDAOImpl.findAll(EmpresaDAOImpl.java:184)
    at activitat3.test.Main.llistarEmpreses(Main.java:330)
    at activitat3.test.Main.main(Main.java:93)

此异常表明使用 readSQL() 方法从 java.sql.SQLData 读取的对象无法转换为 Java 对象。

我应该如何以这种方式处理对象?

readInt() 返回 Integer,readString 返回 String,但 readObject() 不能强制转换或给定自定义 Object?

目标

我想从 OracleSQL 数据库this way 读取映射对象。

【问题讨论】:

  • 你的EmpresaSqlData 类实现了SQLData,但是你的Contacte 类也实现了吗?您尚未指定类型 USER.EMPRESA 的定义,但它的一个字段看起来好像是另一个自定义 Oracle 类型,它对应于 Contacte,就像 USER.EMPRESA 对应于 EmpresaSqlData 一样。
  • 我实际上发现了为什么感谢您的评论,我检查了 Map 对象并评论了 USER.CONTACTE。到那里是:)

标签: java sql database oracle types


【解决方案1】:

从 cmets 看来,问题似乎在于 Contacte 类的类似映射丢失或不完整。

堆栈跟踪显示正在输入EmpresaSqlData 类,因此该类型的映射正在工作。如果 Contacte 类没有从数据库映射,那么可能没有 Oracle 类型直接映射到此类,或者按照您的 EmpresaSqlData 的建议,映射到它的子类。

【讨论】:

  • 是的,忘记将对象添加到地图中。所以如果你这么回答。我会完全接受。
猜你喜欢
  • 2017-04-07
  • 2017-11-26
  • 2011-11-04
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多