gpt4 book ai didi

java - Hibernate 和 Postgres : function st_buffer(bytea, 数字)不是唯一的

转载 作者:行者123 更新时间:2023-11-29 12:03:58 24 4
gpt4 key购买 nike

我正在 Java 应用程序中使用 Hibernate 5.1.0。我正在将两者连接到具有 Postgis 扩展和 Oracle 数据库的 Postgres 9.5。我需要在我的数据库中找到所有与我应用缓冲区的给定几何体相交的几何体,例如:

Query query = session
.createQuery("select b from Block b where intersects(b.geom, buffer(:geometry, " + bufferDistance + ")) = "
+ UtilsHelper.getTrueBooleanValue(em));
query.setParameter("geometry", geom);
List<Block> blocks = query.list();

这在 Oracle 中有效,但在 Postgres 中我会得到错误:

Caused by: org.postgresql.util.PSQLException: ERROR: function st_buffer(bytea, numeric) is not unique
Hint: Could not choose a best candidate function. You might need to add explicit type casts.
Position: 243
at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2270)

这是有道理的,因为它无法在以下功能之一之间进行选择:

geometry ST_Buffer(geometry g1, float radius_of_buffer);
geography ST_Buffer(geography g1, float radius_of_buffer_in_meters);

UtilsHelper.getTrueBooleanValue(em) 将根据实体管理器获取正确的 boolean 值,即 Oracle 的 0/1 和 Postgres 的 true/false。

一个明显的解决方案是删除其中一个函数。除此之外,还有什么办法可以解决这个问题吗?

最佳答案

我不会声称对 Hibernate 了解太多,但似乎一个简单的修复是 explicitly cast带有 CAST(:geometry AS geometry) 的 bytea,并现代化其余查询以添加“ST_”前缀,该前缀用于较新的 PostGIS 版本。

更重要的是,您永远不应该使用以下形式编写查询:

SELECT b
FROM Block b
WHERE ST_Intersects(b.geom, ST_Buffer(CAST(:geometry AS geometry), :bufferDistance)) = TRUE;

使用缓冲区选择区域比使用基于距离的选择更慢且不完美 ST_DWithin function找到一定距离内的几何图形。 ST_DWithin 还可以使用空间索引(如果可用)。并且 boolean 运算符不需要具有 = + UtilsHelper.getTrueBooleanValue(em) 部分(即 TRUE = TRUETRUE)。只需将其删除即可。

试着写一个看起来更像的函数:

SELECT b
FROM Block b
WHERE ST_Dwithin(b.geom, CAST(:geometry AS geometry), :distance);

(使用两个参数:geometry:distance)

关于java - Hibernate 和 Postgres : function st_buffer(bytea, 数字)不是唯一的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37539789/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com