Нет карт для LONGVARCHAR в Hibernate 3.2 - PullRequest
3 голосов
/ 24 февраля 2010

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

"Нет сопоставления диалектов для типа 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 ]

2 голосов
/ 24 февраля 2010

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

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

  2. Или используйте пользовательский диалект, предложенный в ЧЧЧ-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 голос
/ 02 марта 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...