MySQL 视图中 LONGTEXT 字段的 JPA 本机查询导致错误
Posted
技术标签:
【中文标题】MySQL 视图中 LONGTEXT 字段的 JPA 本机查询导致错误【英文标题】:JPA native query for LONGTEXT field in a MySQL view results in error 【发布时间】:2010-11-02 10:24:47 【问题描述】:我有以下 JPA SqlResultSetMapping:
@SqlResultSetMappings(
@SqlResultSetMapping(name="GroupParticipantDTO",
columns=
@ColumnResult(name="gpId"),
@ColumnResult(name="gpRole"),
// @ColumnResult(name="gpRemarks")
)
这样使用:
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");
视图是这样的:
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
;
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)
什么给了?如何从本机查询中获取 LONGTEXT 列?
【问题讨论】:
你有没有想过这个问题?我遇到了同样的问题。 【参考方案1】:在HHH-1483 和HHH-3892 中报告了此问题。简而言之,Hibernate 不知道如何映射原生查询返回的 LONGVARCHAR
列。
这个问题在 Hibernate 3.5.0+ 中得到修复。对于以前的版本,解决方法是扩展 MysqlDialect
以为 LONGVARCHAR
注册正确的 Hibernate Type
:
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());
【讨论】:
以上是关于MySQL 视图中 LONGTEXT 字段的 JPA 本机查询导致错误的主要内容,如果未能解决你的问题,请参考以下文章
将包含 LONGTEXT 字段的 MySQL 表索引到 Elastic Search
mysql客户端中使用简单的SQL语句来更新名为‘desc’的longtext类型字段,报错1064
如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回