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

Я представляю 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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
2 201
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вероятно, вы ищете переменную 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;
vladmihalcea.com/…
gavenkoa 05.01.2020 22:07
Ответ принят как подходящий

Параметр 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 или лучше.

Другие вопросы по теме