Postgres 错误方法 org.postgresql.jdbc.PgConnection.createClob() 未实现

Posted

技术标签:

【中文标题】Postgres 错误方法 org.postgresql.jdbc.PgConnection.createClob() 未实现【英文标题】:Postgres Error method org.postgresql.jdbc.PgConnection.createClob() is not implemented 【发布时间】:2017-10-09 20:21:55 【问题描述】:

当我使用连接对象调用createClob 方法时,如下所示:

Clob clob = con.createClob();

抛出以下异常:

Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented.
        at org.postgresql.Driver.notImplemented(Driver.java:659)
        at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1246)
        at org.apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.java:868)
        at org.apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.java:868)

我正在使用数据库 PostgreSQL 9.6.2 和 JDK8 并使用 commons-dbcp2 连接池,并在 pom.xml 中添加了以下 Postgres 依赖项

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.1.1</version>
</dependency>

org.postgresql.jdbc.PgConnection类中,createClob实现如下图所示,抛出异常:

@Override
public Clob createClob() throws SQLException 
    checkClosed();
    throw org.postgresql.Driver.notImplemented(this.getClass(), "createClob()");

解决此问题的解决方案或解决方法是什么?或者我们如何在 Postgres 查询中设置 CLOB 数据?

【问题讨论】:

【参考方案1】:

TL;DR

在您的application.yml 中设置spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 或, 在您的persistence.xml 中设置hibernate.jdbc.lob.non_contextual_creation=true

这是 JBoss 社区中的一个已知错误。

此错误出现在旧版本和带有 Spring-Boot 2.0.0.RC1 及更高版本的新版本中。

解决方案

    使用更新的向后兼容版本更新您的 postgressql 驱动程序。 在您的application.yml 中设置spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true 或, 在您的 persistence.xml 中设置 hibernate.jdbc.lob.non_contextual_creation=true 如果它不起作用,请参阅下面的这个技巧:

解决方案是在您的属性文件中添加这一行(如果您不使用 spring,则添加类似的内容)

spring.jpa.properties.hibernate.temp.use_jdbc_metadata_defaults= false

所以,您的 application.yml 应该如下所示:

spring:
    application:
      name: employee-service

    datasource:
      url: jdbc:postgresql://localhost:5432/db_development
      platform: POSTGRESQL
      username: ...
      password: ...

    jpa:
      hibernate:
        ddl-auto: create-drop
        dialect: org.hibernate.dialect.PostgreSQL9Dialect
        show_sql: true
      properties.hibernate.temp.use_jdbc_metadata_defaults: false


server:
  port: 8080

参考:

https://o7planning.org/en/11661/spring-boot-jpa-and-spring-transaction-tutorial

hibernate with c3p0: createClob() is not yet implemented

感谢 Binakot 的评论。我已经更新了帖子。

【讨论】:

如果您使用 Java 配置,请添加 org.hibernate.cfg.AvailableSettings#NON_CONTEXTUAL_LOB_CREATION 作为 JpaPropertyMap 的键和 "true" 作为值。 您也可以在application.yml 中设置non_contextual_creation(不仅在persistence.xml 中):spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true【参考方案2】:

将其放入 application.properties

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

【讨论】:

【参考方案3】:

PostgreSQL 并没有真正的“CLOB”。只需将setString(String)setObject(...)Types.STRING 一起使用。

【讨论】:

【参考方案4】:

使用 spring-boot 2.1.9.RELEASE 我添加了以下内容并且它起作用了

spring:
  jpa:
    properties.hibernate.temp.use_jdbc_metadata_defaults: false
    database-platform: org.hibernate.dialect.PostgreSQL94Dialect

【讨论】:

以上是关于Postgres 错误方法 org.postgresql.jdbc.PgConnection.createClob() 未实现的主要内容,如果未能解决你的问题,请参考以下文章

postgres 错误:列“id”不存在?

遇到错误时如何停止 Postgres 脚本?

Django Postgres 完整性错误

Docker-Compose Postgres 5432 绑定:地址已在使用错误

pgpool-II使用问题之SCRAM方法错误

Laravel 迁移 Postgres 错误