我在现有的应用中引入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/