postgresql - native SQL 查询的默认模式(spring-boot + hibernate + postgresql + postgis)

标签 postgresql hibernate spring-boot 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 配置之前工作 - 在 persistence.xml 中指定 hibernate.default-schema = OUR_SCHEMA 就足够了。

堆栈:

Spring 启动:2.0.6

hibernate :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 参数中可能支持也可能不支持多个模式。

另一种选择是在 our_schema 模式中安装 PostGIS 扩展(它提供了 make_point() 函数):

CREATE EXTENSION postgis SCHEMA our_schema;

这样一来,您的搜索路径中只需要一个架构。

关于postgresql - native SQL 查询的默认模式(spring-boot + hibernate + postgresql + postgis),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886431/

相关文章:

sql - 跨移动窗口计算字符串值

PostgreSQL 错误 : canceling statement due to conflict with recovery

postgresql - 使用 Postgres 快速插入数组

java - hibernate :What makes JDBC connections expensive?

tomcat - spring boot embedded Tomcat的crash log在哪里?

c# - 我如何在 C# 中表示像 1/3 这样的分数?

java - 如何阻止 hibernate 在 ManyToMany 映射中插入表?

java.lang.IllegalStateException : Unable to read meta-data for class while implementing open api with spring boot

spring - thymeleaf spring boot templates 子文件夹中的 View

java - JPA CONSOLE 无法正常工作