views:

1122

answers:

1

Hi,

I have the following JPA SqlResultSetMapping:

 @SqlResultSetMappings({               
    @SqlResultSetMapping(name="GroupParticipantDTO", 
      columns={ 
       @ColumnResult(name="gpId"),
       @ColumnResult(name="gpRole"),
 //    @ColumnResult(name="gpRemarks")
      }  
    )

Which is used like this:

 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");

The view is like this:

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
;

The GroupParticipation table has the remarks column defined as LONGTEXT (I'm using Mysql 5.x)

Now for the problem: When the remarks field is commented out from the query everything works perfectly, but if I try to include the remarks field in the query, I get the following error:

 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)

What gives? How can I get a LONGTEXT column from a native query?

+2  A: 

This problem is reported in HHH-1483 and HHH-3892. In short, Hibernate does not know, how to map a LONGVARCHAR column returned by a native query.

This problem is fixed in Hibernate 3.5.0+. For previous versions, a workaround would be to extend the MysqlDialect to register the correct Hibernate Type for a 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());
    }
}
Pascal Thivent