kos*_*ant 4 mysql orm hibernate jpa longtext
我有以下JPA SqlResultSetMapping:
@SqlResultSetMappings({
@SqlResultSetMapping(name="GroupParticipantDTO",
columns={
@ColumnResult(name="gpId"),
@ColumnResult(name="gpRole"),
// @ColumnResult(name="gpRemarks")
}
)
Run Code Online (Sandbox Code Playgroud)
使用方式如下:
StringBuilder sbQuery = new StringBuilder("Select ");
sbQuery.append(" gpId, ");
sbQuery.append(" gpRole, ");
// sbQuery.append(" gpRemarks ");
sbQuery.append(" FROM v_group_participants_with_details ");
Query query = em.createNativeQuery(sbQuery.toString(), "GroupParticipantDTO");
Run Code Online (Sandbox Code Playgroud)
视图是这样的:
DROP VIEW IF EXISTS `v_group_participants_with_details`;
CREATE VIEW `v_group_participants_with_details`
AS
SELECT
gp.id AS gpId,
gp.role AS gpRole,
gp.remarks AS gpRemarks
FROM GroupParticipation gp
;
Run Code Online (Sandbox Code Playgroud)
GroupParticipation表的备注列定义为LONGTEXT(我使用的是Mysql 5.x)
现在针对问题:当从查询中注释掉备注字段时,一切都运行正常,但如果我尝试在查询中包含备注字段,则会收到以下错误:
javax.persistence.PersistenceException: org.hibernate.MappingException:
No Dialect mapping for JDBC type: -1
at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException
(AbstractEntityManagerImpl.java:614)
at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:76)
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?如何从本机查询中获取LONGTEXT列?
在HHH-1483和HHH-3892中报道了该问题.简而言之,Hibernate不知道如何映射LONGVARCHAR
本机查询返回的列.
这个问题在Hibernate 3.5.0+中得到修复.对于先前的版本,一个解决方法是延长MysqlDialect
登记正确的Hibernate Type
为LONGVARCHAR
:
import java.sql.Types;
import org.hibernate.Hibernate;
public class MyMySQL5Dialect extends org.hibernate.dialect.MySQL5Dialect {
public MyMySQL5Dialect() {
super();
// register additional hibernate types for default use in scalar sqlquery type auto detection
registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName());
}
}
Run Code Online (Sandbox Code Playgroud)