Я работаю с Hibernate 5.1.0
в приложении Java. Я подключаюсь как к Postgres 9.5
с Postgis
расширениями, так и к Oracle
базам данных. Мне нужно найти все геометрии в моей базе данных, которые пересекаются с заданной геометрией, к которой я применяю буфер, например:
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)
просто получит правильное логическое значение в зависимости от менеджера сущностей, то есть 0/1 для Oracle и true/false для Postgres.
Одним из очевидных решений было бы отказаться от одной из функций. Кроме этого, есть ли способ исправить это?