Hibernate, нулевые значения и nativeSQL - PullRequest
1 голос
/ 04 февраля 2010

Я использую hibernate с mySQL, и у меня возникает следующая проблема: я делаю nativeSQL запрос к таблице, среди прочего, со столбцом длиной в символ.Этот столбец может получить значение NULL.Теперь я получаю следующее исключение при запросе:

4-feb-2010 10.31.00 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: nazeuro; String index out of range: 0
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
        at java.lang.String.charAt(String.java:686)
        at org.hibernate.type.CharacterType.get(CharacterType.java:29)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
        at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)
        at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:474)
        at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:420)
        at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:317)
        at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:606)
        at org.hibernate.loader.Loader.doQuery(Loader.java:701)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.doList(Loader.java:2220)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
        at org.hibernate.loader.Loader.list(Loader.java:2099)
        at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
        at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
        at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
        at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
        at Views.Components.QuickLookup$updater.run(QuickLookup.java:102)

Я пытался найти решение этой проблемы, я даже находил здесь сообщения на SO, но каждый раз это касается сопоставления объектов и написания пользовательских классов для обработкипроблема.В этой ситуации мне нужен массив объектов.Я знаю, что решение могло бы состоять в том, чтобы изменить таблицу, но я бы избегал этого, поскольку я должен работать с уже существующей БД.Так есть ли у вас какие-либо возможные решения?


SQLQuery query = sess.createSQLQuery("SELECT * from " + table + " WHERE " + filter + " LIKE '" + search + "%'");
                    System.out.println(query.toString());
                    List<Object[]> result = query.list();

Ответы [ 3 ]

3 голосов
/ 04 февраля 2010

Какую версию Hibernate вы используете? В 3.3.2 это CharacterType.get():

public Object get(ResultSet rs, String name) throws SQLException {
    String str = rs.getString(name);
    if (str==null) {
        return null;
    }
    else {
        return new Character( str.charAt(0) );
    }
}

В случае, если это не было очевидно, исключение указывает на то, что вы получили пустую ненулевую строку ("") из набора результатов, что приводит к CharacterType к barf, поскольку это не ожидаемое значение CHAR(1). (Это CHAR(1) столбец, не так ли?)

0 голосов
/ 13 июня 2014

Используйте выражение CASE для каждого символьного столбца в вашей таблице

CASE column_name = '' THEN '' ELSE column_name END

0 голосов
/ 23 марта 2011

используйте встроенную функцию ВЛЕВО или ВПРАВО, чтобы изменить тип данных столбца в источнике

давайте предположим, что это был SQL-запрос, выдавший ошибку select username from Users

изменить его с помощью: выберите ВЛЕВО (имя пользователя, 100 ) из пользователей

число должно быть равно размеру поля

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