Java SDO_几何体类型属性的显示值

Java SDO_几何体类型属性的显示值,java,sql,oracle,oracle11g,Java,Sql,Oracle,Oracle11g,我试图使用JDBC在Oracle 11g数据库中创建的表中显示行,问题是我无法使用以下代码获取类型为“SDO_GEOMETRY”的属性“SHAPE”的值,顺便说一句,对于表的其他属性,该代码可以正常工作: try { Class.forName("oracle.jdbc.driver.OracleDriver"); System.out.println("Driver O.K."); String url

我试图使用JDBC在Oracle 11g数据库中创建的表中显示行,问题是我无法使用以下代码获取类型为“SDO_GEOMETRY”的属性“SHAPE”的值,顺便说一句,对于表的其他属性,该代码可以正常工作:

        try {

            Class.forName("oracle.jdbc.driver.OracleDriver");
            System.out.println("Driver O.K.");

            String url = "jdbc:oracle:thin:@localhost:1521:xe";
            String user = "system";
            String passwd = "isima";

            Connection conn = DriverManager.getConnection(url, user, passwd);
            System.out.println("Connexion effective");

            Statement myStmt = null;
            ResultSet myRs = null;          

            myStmt = conn.createStatement();

            myRs = myStmt.executeQuery("SELECT * FROM testGeo");

            while (myRs.next()) {
            System.out.println(myRs.getString("shape"));

            } 

            } catch (Exception e) {
            e.printStackTrace();
            } 
以下是用于创建testGeo表和一些测试数据的DDL语句

CREATE TABLE testGeo (
  GeoID NUMBER PRIMARY KEY,
  name VARCHAR2(32),
  shape SDO_GEOMETRY);

INSERT INTO testGeo VALUES(
  1,
  'cola_a',
  SDO_GEOMETRY(
    2003,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(1,1, 5,7)
  )
);

INSERT INTO testGeo VALUES(
  2,
  'cola_b',
  SDO_GEOMETRY(
    2003,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(2,1, 6,7)
  )
);

INSERT INTO testGeo VALUES(
  3,
  'cola_c',
  SDO_GEOMETRY(
    2003,
    NULL,
    NULL,
    SDO_ELEM_INFO_ARRAY(1,1003,3),
    SDO_ORDINATE_ARRAY(1,1, 9,9)
  )
);

你可以用像

select g.geoid, g.name, go.column_value
from testgeo g, table(g.shape.SDO_ORDINATES) go;

但是对于形状中的每个数字,您将得到一行

我认为错误在于
getString()
,因为SDO_几何体无法转换为字符串。老实说,我对oracleDB一无所知,所以这只是一个猜测

您是否尝试过
getInt()
getByteArray()
或类似选项


从数据库获取数据时有很多可能性。

问题本身是由于您试图检索一个复杂的对象,该对象是一个自定义Oracle对象,应使用其自己的映射库进行处理。示例中使用的
SDO_几何体
类型声明:

SDO_GEOMETRY(
   2003,
   NULL,
   NULL,
   SDO_ELEM_INFO_ARRAY(1,1003,3),
   SDO_ORDINATE_ARRAY(1,1, 5,7)
)
是Oracle Spatial软件包的一部分,依赖于自定义对象。这些不能像
VARCHAR
NUMBER
这样的基本SQL列那样容易读取,这就是为什么
getString(“shape”)
调用不会产生结果的原因

解决方案是使用Oracle提供的专门为此目的而设计的:

映射Oracle Spatial的SQL类型MDSYS.SDO_几何体的Java类。 仅支持Oracle JDBC驱动程序版本8.1.7或更高版本。提供 对Oracle Spatial中存储的geomeries的基本访问功能 数据库

通过类路径上的这个库,您将能够使用自定义Java映射来操作您的shape对象:

/// reading a geometry from database
ResultSet rs = statement.executeQuery("SELECT shape FROM testGeo");
STRUCT st = (oracle.sql.STRUCT) rs.getObject(1);
//convert STRUCT into geometry
JGeometry j_geom = JGeometry.load(st);
为此,应该使用Oracle Spatial Java包中的类。可以调用空间类型,如:

// Read a geometry from the DB.
ResultSet rs = statement.executeQuery("SELECT shape FROM testGeo where name='cola_a'");
STRUCT stGeo = (oracle.sql.STRUCT) rs.getObject(1);
JGeometry jGeo = JGeometry.load(stGeo);
// Use jGeo to fetch the required data.
如果需要将几何图形写回数据库,可以尝试以下操作:

 // Write a geometry back to the DB.
 PreparedStatement ps = connection.prepareStatement("UPDATE testGeo set shape=? where name='cola_a'");
 STRUCT stGeo = JGeometry.store(jGeom, connection);
 ps.setObject(1, stGeo);
 ps.execute();

注意:有关类API的用法,请参阅JGeometry文档。

您能否提供用于创建
testGeo
表和一些测试数据的DDL语句。问题的可能重复之处在于,我得到的“null”实际上是表中每一行的属性形状值,当我尝试使用JDBC访问我的数据库时,如上所示。谢谢,你知道我如何使用Hibernate来访问数据库吗?Hibernate 5不受支持(我想现在还不支持),但Hibernate团队对Spatial的官方支持是:。