Собственный запрос JPA для поля LONGTEXT в представлении MySQL приводит к ошибке

Asked
Viewd6434

4

У меня есть следующий 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 из собственного запроса?

  • Вы когда-нибудь в этом разбирались? У меня та же проблема.

    Stephano06 августа 2010, 23:28

1 ответов

7

Об этой проблеме сообщается в 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());
    }
}