【问题标题】:Default schema for native SQL queries (spring-boot + hibernate + postgresql + postgis)本机 SQL 查询的默认模式(spring-boot + hibernate + postgresql + postgis)
【发布时间】:2019-05-22 00:33:26
【问题描述】:

我在现有应用中引入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 就足够了。

堆栈:

弹簧启动:2.0.6

休眠:5.3.1.Final

postgresql:42.2.5

postgis:2.2.1

【问题讨论】:

    标签: postgresql hibernate spring-boot postgis


    【解决方案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;
    

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

    【讨论】:

      【解决方案2】:

      如果你使用 hibernate.default_schema,那么对于原生查询,你需要提供 {h-schema} 占位符,类似的东西

      SELECT ST_MAKEPOINT(cast(longitude as float), cast(latitude as float)) FROM {h-schema}OUR_TABLE;
      

      【讨论】:

      【解决方案3】:

      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 = 字符串

      指定要在搜索路径中设置的架构(或用逗号分隔的多个架构)。此架构将用于解析在此连接上的语句中使用的不合格对象名称。

      请注意,您可能需要 Postgres 9.6 或更高版本才能获得 currentSchema 支持。

      【讨论】:

        猜你喜欢
        • 2019-09-13
        • 2015-08-31
        • 2016-12-10
        • 2018-03-17
        • 1970-01-01
        • 2016-08-01
        • 2011-06-23
        • 2021-05-19
        • 2023-01-09
        相关资源
        最近更新 更多