在休眠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。
答案 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