Я представляю Spring в существующем приложении (hibernate уже был там) и столкнулся с проблемой с собственными SQL-запросами.
Пример запроса:
SELECT ST_MAKEPOINT(cast(longitude as float), cast(latitude as float)) FROM
OUR_TABLE;
OUR_TABLE находится в OUR_SCHEMA.
Когда мы подключаемся к БД к OUR_SCHEMA:
spring.datasource.url: jdbc:postgresql://host:port/db_name?currentSchema=OUR_SCHEMA
запрос не выполняется, потому что функция ST_MAKEPOINT не найдена - функция находится в схеме: PUBLIC.
Когда мы подключаемся к базе данных без указания схемы, ST_MAKEPOINT обнаруживается и работает правильно, хотя имя схемы необходимо добавить к имени таблицы в запросе.
Поскольку мы говорим о тысячах таких запросов, и все таблицы расположены в OUR_SCHEMA, есть ли шанс каким-либо образом указать схему по умолчанию, чтобы все еще были видны функции из схемы PUBLIC?
До сих пор я пробовал следующие свойства springboot - безуспешно:
spring.jpa.properties.hibernate.default_schema: OUR_SCHEMA
spring.datasource.tomcat.initSQL: ALTER SESSION SET CURRENT_SCHEMA=OUR_SCHEMA
spring.datasource.initSQL: ALTER SESSION SET CURRENT_SCHEMA=OUR_SCHEMA
Кроме того, он работал до перехода на конфигурацию springboot - достаточно было указать hibernate.default-schema = OUR_SCHEMA в persistence.xml.
Куча:
пружина загрузки: 2.0.6
спящий режим: 5.3.1.Final
postgresql: 42.2.5
postgis: 2.2.1





Вероятно, вы ищете переменную PostgreSQL search_path, которая контролирует, какие схемы проверяются при попытке разрешить имена объектов базы данных. Путь принимает несколько имен схем, которые проверяются по порядку. Итак, вы можете использовать следующие
SET search_path=our_schema,public;
Это заставит PostgreSQL искать ваши таблицы (и функции!) Сначала в our_schema, а затем в public. Ваш драйвер JDBC может поддерживать или не поддерживать несколько схем в своем параметре current_schema.
Другой вариант - установить расширение PostGIS (которое предоставляет функцию make_point()) в схеме our_schema:
CREATE EXTENSION postgis SCHEMA our_schema;
Таким образом, в вашем пути поиска должна быть только одна схема.
если вы используете hibernate.default_schema, то для собственных запросов вам необходимо предоставить заполнитель {h-schema}, что-то вроде этого
SELECT ST_MAKEPOINT(cast(longitude as float), cast(latitude as float)) FROM {h-schema}OUR_TABLE;
Параметр JDBC currentSchema позволяет явно указать несколько схем, разделяя их запятыми:
jdbc:postgresql://postgres-cert:5432/db?currentSchema=my,public&connectTimeout=4&ApplicationName=my-app
От https://jdbc.postgresql.org/documentation/head/connect.html
currentSchema = String
Specify the schema (or several schema separated by commas) to be set in the search-path. This schema will be used to resolve unqualified object names used in statements over this connection.
Обратите внимание, что для поддержки currentSchema вам, вероятно, понадобится Postgres 9.6 или лучше.