How to fix the Hibernate “No Dialect mapping for JDBC type” issue

Imagine having a tool that can automatically detect JPA and Hibernate performance issues. Hypersistence Optimizer is that tool!


Recently, stumbled on this question on the Hibernate forum, and since I’ve been seeing it before on StackOverflow and bumped into it myself while working with JPA and Hibernate, I decided to turn the answer into an article.

Therefore, in this article, you are going to find out how you can fix the “No Dialect mapping for JDBC type” Hibernate issue.

Domain Model

Considering we have a Book entity that defines a properties attribute which is associated with a JSON column in the database.

Book table with JSON column

The Book entity can be mapped as follows:

@Entity(name = "Book")
@Table(name = "book")
    name = "jsonb-node", 
    typeClass = JsonNodeBinaryType.class
public class Book {

    private Long id;

    private String isbn;

    @Type(type = "jsonb-node")
    @Column(columnDefinition = "jsonb")
    private JsonNode properties;

    //Getters and setters omitted for brevity

The JsonNodeBinaryType is provided by the hibernate-types project, so if you want to persist JSON properties, you don’t need to write your own Hibernate Types.
Just add the hibernate-types dependency to your project and map the JSON properties accordingly.

Persisting and fetching the Book entity

Now, let’s assume we have added the following Book entity in our database:

Book book = new Book();
        "{" +
        "   "title": "High-Performance Java Persistence"," +
        "   "author": "Vlad Mihalcea"," +
        "   "publisher": "Amazon"," +
        "   "price": 44.99" +


When persisting the Book entity, Hibernate will issue the proper SQL INSERT statement:

        "title":"High-Performance Java Persistence",
        "Vlad Mihalcea",

Now, we fetching the Book entity by its natural identifier, we can see that the properties JSON attribute is fetched as a JsonNode:

Book book = entityManager

    "High-Performance Java Persistence", 

Fetching the JSON attribute using JPQL

Now, if we want to fetch the properties entity attribute using JPQL, we can execute the following query:

JsonNode properties = entityManager
    "select " +
    "from Book b " +
    "where b.isbn = :isbn", JsonNode.class)
.setParameter("isbn", "978-9730228236")

    "High-Performance Java Persistence", 

And everything works properly since the JPQL query is parsed and the underlying Hibernate Type that handles the properties attribute is going to be known when building the result.

Fetching the JSON attribute using native SQL

However, if we try to do the same using a native SQL query:

JsonNode properties = (JsonNode) entityManager
    "SELECT properties " +
    "FROM book " +
    "WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")

    "High-Performance Java Persistence",

Hibernate will throw the following MappingException:

javax.persistence.PersistenceException: org.hibernate.MappingException: No Dialect mapping for JDBC type: 1111

The 1111 JDBC type corresponds to Types.OTHER which is what the PostgreSQL JDBC Driver uses for jsonb column types.

Mapping Types.OTHER to JsonNodeBinaryType

There are several ways you can address this issue. You can register a Hibernate Type to handle the JDBC Types.OTHER either globally or on a per-query basis.

Mapping the JDBC Types.OTHER to JsonNodeBinaryType at the Dialect level

You can map a given JDBC Type code to a Hibernate Type using the database-specific Dialect.

Therefore, for PostgreSQL, we could define a PostgreSQL10JsonDialect that looks as follows:

public class PostgreSQL10JsonDialect
        extends PostgreSQL10Dialect {
    public PostgreSQL10JsonDialect() {
            Types.OTHER, JsonNodeBinaryType.class.getName()

And if we provide the custom PostgreSQL10JsonDialect via the hibernate.dialect configuration property:


The native SQL query will run just fine.

Mapping the JDBC Types.OTHER to JsonNodeBinaryType at the NativeQuery level

Another option is to provide Hibernate Type associated with the current JDBC ResultSet:

JsonNode properties = (JsonNode) entityManager
    "SELECT properties " +
    "FROM book " +
    "WHERE isbn = :isbn")
.setParameter("isbn", "978-9730228236")
.addScalar("properties", JsonNodeBinaryType.INSTANCE)

    "High-Performance Java Persistence",

Notice the addScalar method call which provides the Hibernate Type to be used when handling the Types.Other JDBC column type.

That’s it!

Online Workshops

If you enjoyed this article, I bet you are going to love my upcoming 4-day Online Workshop!


Handling the No Dialect mapping for JDBC type issue is not very complicated, and it can be done either globally or on a per-query basis.

Transactions and Concurrency Control eBook

2 Comments on “How to fix the Hibernate “No Dialect mapping for JDBC type” issue

  1. thank you for the post.
    On NativeQuery level.
    In my case, I use properties on a where condition, but I don’t select it.
    In this case, I’m facing to this exception:
    org.postgresql.util.PSQLException: The column “properties” was not found in this ResultSet.

    • Check out my High-Performance Java Persistence GitHub repository for some test cases that can help you.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

4 day training with a Java Champion 🏆 29th Nov - 2nd Dec