如何使用spring boot注册自定义hibernate类型?

时间:2017-06-21 22:19:09

标签: java hibernate jpa spring-boot

在休眠documentation自定义类型中使用 Configuration 实例进行注册。如何使用spring boot访问此实例并注册我的类型?

对于实体使用 @TypeDef 可以正常工作,但是使用jpa原生查询我得到GPRSboard.print( "POST /.json?auth=" + FIREBASE_AUTH + " HTTP/1.1\r\n" "Host: XXXXXXXXXXXXXXX-461a8.firebaseio.com\r\n" "Content-Type: application/json\r\n" "Content-Length: 16\r\n" "Cache-Control: no-cache\r\n" "\r\n" "{\"param1\":\"7\"}" /* <- contents is only this line, 14 bytes */ );

它适用于我自己的方言并通过 registerHibernateType 进行注册,但只有一种自定义类型注册到列类型 Types.OTHER (JDBC类型1111) 。任何其他自定义类型注册都会覆盖旧注册。

查询很简单,只选择给定自定义类型的常量值。

使用hibernate 5.0.9和spring boot 1.4.0。

2 个答案:

答案 0 :(得分:0)

似乎没有自动将结果映射到自定义类型。

对于postgres,返回的jdbc PGObject包含列类型名称(例如:'tsvector'),但是hibernate自定义类型只知道sql类型(在这种情况下为OTHER),而不是db类型名称,所以它无法进行比赛。

解决方法是打开jpa本机查询并注册返回的标量类型(自定义hibernate类型),例如:

Query query = entityManager.createNativeQuery( "SELECT <SOMETHING> AS res" );
query.unwrap( SQLQuery.class ).addScalar( "res", CustomHibernateType.INSTANCE );

请注意,这会影响QueryDSL(4.1.4),因为没有将标量注册为hibernate自定义类型的机制,因此jpa本机查询失败(JPASQLQuery)。这种情况下的解决方法是使用在QueryDSL中注册了AbstractType的非jpa本机查询,转换将自动完成。

答案 1 :(得分:0)

同一期 PostgreSQL驱动程序42.2.2 休眠5.2.17

我通过添加自定义SQL方言解决了该问题。

import java.sql.Types;
import org.hibernate.dialect.PostgreSQL94Dialect;

public class CustomPostgreSQLDialect extends PostgreSQL94Dialect {

  public ConnectedWellPostgreSQLDialect() {
    super();
    registerHibernateType(Types.OTHER, "pg-uuid");
  }
}

并配置configure hibrenate以使用新类:

spring.jpa.properties.hibernate.dialect.config=com.mypackage.CustomPostgreSQLDialect