21

When I invoke createClob method using connection object as shown below:

Clob clob = con.createClob();

Following exception is thrown:

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)

I`m using database PostgreSQL 9.6.2 with JDK8 and using commons-dbcp2 connection pool, And added following Postgres dependency in pom.xml

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

In class org.postgresql.jdbc.PgConnection, createClob implementation is as shown below which is throwing the exception:

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

What is the solution or workaround to overcome this issue? Or How can we set CLOB data in Postgres queries?

Morteza Jalambadani
  • 2,190
  • 6
  • 21
  • 35
Nirav Patel
  • 1,304
  • 2
  • 13
  • 30

4 Answers4

38

TL;DR

  • Set spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true in your application.yml or,
  • Set hibernate.jdbc.lob.non_contextual_creation=true in your persistence.xml

It's a known error in JBoss community.

This error appears in former versions and new version with Spring-Boot 2.0.0.RC1 as well and higher.

Solution:

  1. Update your postgressql-driver with a newer backward compatible version.
    • Set spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true in your application.yml or,
    • Set hibernate.jdbc.lob.non_contextual_creation=true in your persistence.xml
  2. If it's not working see this trick below:

The solution is to add this line in your property file (or something similar if your are not using spring)

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

So, your application.yml should looks like:

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

Reference:

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

hibernate with c3p0: createClob() is not yet implemented

Thanks to Binakot for his comment bellow. I have updated the post.

KeyMaker00
  • 6,194
  • 2
  • 50
  • 49
  • 1
    If you are using Java-configuration add `org.hibernate.cfg.AvailableSettings#NON_CONTEXTUAL_LOB_CREATION` as key to your JpaPropertyMap and `"true"` as the value. – TheConstructor Jun 30 '18 at 08:38
  • 1
    You can set `non_contextual_creation` in `application.yml` too (not only in `persistence.xml`): `spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true` – Binakot Mar 08 '19 at 19:41
4

put this in to application.properties

spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true
AgentP
  • 6,261
  • 2
  • 31
  • 52
superup
  • 1,765
  • 13
  • 12
1

PostgreSQL doesn't really have "CLOB". Just use setString(String) or setObject(...) with Types.STRING.

Craig Ringer
  • 307,061
  • 76
  • 688
  • 778
1

using spring-boot 2.1.9.RELEASE I added the following and it worked

spring:
  jpa:
    properties.hibernate.temp.use_jdbc_metadata_defaults: false
    database-platform: org.hibernate.dialect.PostgreSQL94Dialect
Arthur Kazemi
  • 960
  • 1
  • 10
  • 11