2010-02-04 79 views
1

我正在使用hibernate和mySQL,我遇到了以下問題:我在表中查詢一個nativeSQL,其中包含一個字符長的列。此列可以爲空。現在,我收到以下異常而查詢:休眠,空值和nativeSQL

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) 

我一直在使用Google來解決這個問題,我甚至發現帖子在這裏SO,但每次它是關於映射對象和編寫自定義類來處理問題。在這種情況下,我需要的是一個Object數組。我知道解決方案可能是更改表格,但我會避免它,因爲我必須使用預先存在的數據庫。那麼你有什麼可能的解決方案嗎?


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

因此該列是'CHAR(1)'?你實體中的類型是什麼?請顯示你的代碼。 – Henning 2010-02-04 09:46:56

+0

在我的實體中沒有類型,實際上它是一個NATIVE SQL QUERY,它將每行返回一個Object [](每列一個對象)。因此沒有實體... – gotch4 2010-02-04 10:23:45

+0

我們需要查看您的代碼,尤其是Hibernate映射 – Mark 2010-02-04 11:16:13

回答

3
您正在使用哪個版本的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

我正在使用3.2.5。我想我應該得到一個JDBC連接並繞過休眠......你有更好的想法嗎? – gotch4 2010-02-04 13:45:29

+0

@Gotch:這絕對是一個選項,除了HQL之外,您還沒有在這一點上使用它的任何功能。 我很好奇,儘管一個空字符串可以如何使它成爲結果集。如果你用'WHERE charCol ='''手動查詢CHAR列,你會得到一個結果嗎?如果是這樣,也許JDBC驅動程序有錯,誰知道。 祝你好運。 – Henning 2010-02-04 14:47:24

0

使用原生功能左或右更改列數據類型起源於

讓我們假設這是SQL查詢給來自用戶的錯誤選擇用戶名

與更改:從用戶

選擇LEFT(用戶名,)的數量應等於該字段的大小

0

使用每個字符列的CASE表達式中的表

CASE列名= '' 然後 '' ELSE列名END