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?

4 Answers 4

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.

Sign up to request clarification or add additional context in comments.

2 Comments

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.
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
4

put this in to application.properties

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

Comments

1

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

Comments

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.