【发布时间】: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