2010-02-24 2 views
3

Я запускаю Hibernate 3.2.0 с MySQL 5.1. После обновления group_concat_max_len в MySQL (из-за GROUP_CONCAT запроса, который был превышая значение по умолчанию), я получил следующее исключение при выполнении SQLQuery с пунктом GROUP_CONCAT:Нет сопоставления для LONGVARCHAR в Hibernate 3.2

«Нет Диалект отображение для типа JDBC: -1»

-1 - значение java.sql.Types для LONGVARCHAR. Очевидно, что увеличение значения group_concat_max_len вызывает вызовы group_concat, чтобы вернуть значение LONGVARCHAR. Это, как представляется, являются экземпляр этой ошибки:

http://opensource.atlassian.com/projects/hibernate/browse/HHH-3892

Я предполагаю, что есть исправление этой проблемы в Hibernate 3.5, но это еще разрабатываемая версия, так что я не решаюсь поставить его в производство, и не знаю, вызовет ли это проблемы для других частей моей базы кода. Я мог бы просто использовать JDBC-запросы, но тогда я должен заменить каждый экземпляр SQLQuery на предложение group_concat.

Любые другие предложения?

ответ

2

Да, два предложения. Либо:

  1. Patch Hibernate 3.2.0 с изменениями HHH-3892 т.е. получить Hibernate источники, применять патчи для r16501, r16823 и r17332) и построить Hibernate себя.

  2. Или использовать собственный диалект, как предложено в HHH-1483:

    public class MySQL5Dialect extends org.hibernate.dialect.MySQL5Dialect { 
        public MySQL5Dialect() { 
         super(); 
         // register additional hibernate types for default use in scalar sqlquery type auto detection 
         // http://opensource.atlassian.com/projects/hibernate/browse/HHH-1483 
         registerHibernateType(Types.LONGVARCHAR, Hibernate.TEXT.getName()); 
        }  
    } 
    

Вариант # 2 легко реализовать и протестировать (я не сделал), а вариант # 1 является «чище», но требуется (немного) больше работы. Лично я бы выбрал вариант №1, потому что это то, что вы получите с 3.5 и, таким образом, гарантирует плавное обновление.

1

Ответ Паскаля звучит очень хорошо, но на данный момент я взял ярлык.

Вызов addScalar для каждого возвращаемого значения запроса также устраняет эту проблему. Как оказалось, в моем коде было не так много мест с group_concat, но явных вызовов addScalar не было. Добавление этих вопросов устраняет проблему. (Обратите внимание, что вы должны иметь вызов addScalar для каждого возвращаемого значения, а не только те, что поступают из group_concat.)

+0

+1 спасибо за это, я использовал group_concat в своем запросе и с помощью addScalar по всем моим возвращаемым значениям выяснил проблему. –

+0

Привет ... у вас есть идея «почему» это смягчает проблему? – Victor

Смежные вопросы