20
votes

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?

4

4 Answers

34
votes

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.

3
votes

put this in to application.properties

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

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

0
votes

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