【问题标题】:srid(geometry) function does not exist: Java hibernatesrid(geometry) 函数不存在:Java 休眠
【发布时间】:2014-02-20 11:41:31
【问题描述】:

我正在重新承担我大学里有人正在从事的一个旧项目。它主要是地理数据的一些数据库管理(在 psql 中进行,并使用 postgis 1.5 和 2.0)以及在 java netbeans 中进行的一些修改和 GUI。对于这两者之间的接口,正在使用 Maven 和 hibernate。

问题是,当我尝试运行应该可以运行的应用程序时,我得到了这个错误

SEVERE: ERROR: no existe la función srid(geometry)
Exception in thread "AWT-EventQueue-0" org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:174)
    at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1163)
    at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:334)
    at testdb.ui.NetworkClustering.updateOLTdistance(NetworkClustering.java:609)
    at testdb.ui.MetroClustering.setMetroOltDist(MetroClustering.java:118)
    at testdb.ui.MetroClustering.clusterData(MetroClustering.java:38)
    at com.kipouridis.thesis.GUI.MetroDialog.jButton1ActionPerformed(MetroDialog.java:102)
    at com.kipouridis.thesis.GUI.MetroDialog.access$100(MetroDialog.java:19)
    at com.kipouridis.thesis.GUI.MetroDialog$2.actionPerformed(MetroDialog.java:56)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:154)
    at java.awt.WaitDispatchSupport$2.run(WaitDispatchSupport.java:182)
    at java.awt.WaitDispatchSupport$4.run(WaitDispatchSupport.java:221)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.WaitDispatchSupport.enter(WaitDispatchSupport.java:219)
    at java.awt.Dialog.show(Dialog.java:1082)
    at java.awt.Component.show(Component.java:1651)
    at java.awt.Component.setVisible(Component.java:1603)
    at java.awt.Window.setVisible(Window.java:1014)
    at java.awt.Dialog.setVisible(Dialog.java:1005)
    at com.kipouridis.thesis.GUI.ONUAdmin.calcDistQueryButtonActionPerformed(ONUAdmin.java:219)
    at com.kipouridis.thesis.GUI.ONUAdmin.access$100(ONUAdmin.java:44)
    at com.kipouridis.thesis.GUI.ONUAdmin$2.actionPerformed(ONUAdmin.java:94)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6505)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3320)
    at java.awt.Component.processEvent(Component.java:6270)
    at java.awt.Container.processEvent(Container.java:2229)
    at java.awt.Component.dispatchEventImpl(Component.java:4861)
    at java.awt.Container.dispatchEventImpl(Container.java:2287)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
    at java.awt.Container.dispatchEventImpl(Container.java:2273)
    at java.awt.Window.dispatchEventImpl(Window.java:2719)
    at java.awt.Component.dispatchEvent(Component.java:4687)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:735)
    at java.awt.EventQueue.access$200(EventQueue.java:103)
    at java.awt.EventQueue$3.run(EventQueue.java:694)
    at java.awt.EventQueue$3.run(EventQueue.java:692)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
    at java.awt.EventQueue$4.run(EventQueue.java:708)
    at java.awt.EventQueue$4.run(EventQueue.java:706)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:705)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

到达断点,我发现当它到达数据库的一次更新时出现错误,遵循这一行:

result = oltDistQ.executeUpdate();

它在 oltDistQ 中应用的查询如下:

String oltDistQuery = "update connections set oltdist = (select result.distance from "
                + "(select sum( st_length(st_transform(the_geom,2163))) as distance "
                + "from dijkstra_sp_delta('ways' , ( select onu.source from onu where onu.gid = connections.gid  )"
                + " ,    (select rn.source from onu as rn where rn.gid = "
                + "(select olt_id from metro_nets where net_id = connections.metro_net )  ),0.01)) as result   ) "
                + "where metro_net = " + 0;

我检查了数据库,所有列似乎都存在,据我所知,该查询中没有说明函数 srid(geometry)。我知道这个函数已经更新,现在它被声明为st_srid(geometry),但是我找不到这个函数在哪里被调用或者我可以在哪里检查它。

我检查了 java 文件,似乎没有一个在查询更新中使用该函数,对于 DB,如果正在调用该函数并且 psql 将无法识别它,则表没有'不能被创造;但它们已创建并具有所需的数据。

有很多行代码(和代码文件),我不是很了解,因为我说过这不是我自己的项目。但是我在这里失去了希望,因为我不知道在哪里检查以解决此错误。

拜托,如果有人知道一些事情,那将非常有帮助。

提前致谢!

【问题讨论】:

    标签: java hibernate postgis psql srid


    【解决方案1】:

    原始函数被命名,例如srid(geometry),但这些后来被重命名为 ST_ 前缀(即,spatial type)。要使用最初命名的函数,请找到一个名为 legacy.sql 的 PostGIS 安装附带的启动器脚本(legacy_minimal.sql 也可能有效,但我不知道)。这些将为您的数据库提供旧客户所期望的旧功能。

    像这样使用它们:

    psql -d [yourdatabase] -v ON_ERROR_STOP=1 -f legacy.sql
    

    【讨论】:

    • 嗨迈克!谢谢回答。真诚地,我在 sql 方面工作不多,所以我尝试运行您建议的查询(legacy.sql)。我的主文件夹中没有它,所以我从 postgis 主页下载。问题是我已经有了 spatial_ref_sys 表,当我运行查询时,我得到了一个重复的键。对于第一行,即: INSERT INTO "spatial_ref_sys" ("srid","auth_name","auth_srid","srtext","proj4text") VALUES (4326,'E... 我认为还可以,但是因为那时我一直收到错误。F.e.我知道函数 addgeometry 不是唯一的。所以我不知道我是否应该继续
    • 还有一个legacy_minimal.sql 文件你也可以试试。使用您的 PostGIS 版本附带的脚本,因为它们可以是特定于版本的。
    猜你喜欢
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多