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中LongText类型大字段查询优化

如何在 MySQL/MariaDB 中将 LONGTEXT 字段作为 JSON 返回

Grails GORM MySQL 生成 TEXT 或 LONGTEXT 列

Mysql 中的Text字段的范围?与使用方法!