Метод ошибок Postgres org.postgresql.jdbc.PgConnection.createClob() не реализован

Когда я createClob метод 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, и добавил следующую зависимость Postgres в pom.xml

<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()");
}

Какое решение или способ обойти эту проблему? Или Как мы можем установить данные CLOB в запросах Postgres?

Ответы

Ответ 1

TL; DR

  • Установите spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true в вашем application.yml или,
  • Установите hibernate.jdbc.lob.non_contextual_creation=true в вашем persistence.xml

Это известная ошибка в сообществе JBoss.

Эта ошибка появляется и в предыдущих версиях, и в новой версии Spring-Boot 2.0.0.RC1 и выше.

Решение:

  1. Обновите ваш postgressql-драйвер более новой обратно совместимой версией.
    • Установите spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true в application.yml или,
    • Установите hibernate.jdbc.lob.non_contextual_creation=true в вашем файле persistence.xml
  2. Если это не работает, посмотрите этот трюк ниже:

Решение состоит в том, чтобы добавить эту строку в свой файл свойств (или что-то подобное, если вы не используете 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

спящий режим с помощью c3p0: createClob() еще не реализован

Спасибо Binakot за его комментарий ниже. Я обновил пост.

Ответ 2

поместите это в application.properties

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

Ответ 3

PostgreSQL на самом деле не имеет "CLOB". Просто используйте setString(String) или setObject(...) с Types.STRING.

Ответ 4

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = верно

Просто добавьте это к своему application.properties, и это может сработать. это сработало для меня.

Ответ 5

используя spring-boot 2.1.9.RELEASE я добавил следующее, и это сработало

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