Схема по умолчанию для собственных запросов SQL (spring-boot + hibernate + postgresql + postgis) - PullRequest
0 голосов
/ 21 декабря 2018

Я представляю 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. Окончательный

postgresql: 42.2.5

postgis: 2.2.1

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

если вы используете hibernate.default_schema, то для собственных запросов вам нужно предоставить заполнитель {h-schema}, что-то вроде этого

SELECT ST_MAKEPOINT(cast(longitude as float), cast(latitude as float)) FROM {h-schema}OUR_TABLE;
0 голосов
/ 21 декабря 2018

Возможно, вы ищете переменную 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;

Таким образом, в вашем пути поиска должна быть только одна схема.

...