2010-02-24 93 views
3

我正在運行Hibernate 3.2.0和MySQL 5.1。在更新MySQL中的group_concat_max_len之後(因爲group_concat查詢超過了默認值),當執行帶有group_concat子句的SQLQuery時,我得到以下異常:在Hibernate 3.2中沒有映射LONGVARCHAR

「沒有用於JDBC類型的方言映射:-1」

-1是LONGVARCHAR的java.sql.Types值。顯然,增加group_concat_max_len值會導致對group_concat的調用返回一個LONGVARCHAR值。這似乎是這個錯誤的實例:

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

我想有這個問題的Hibernate 3.5的修復,但仍然是一個開發版,所以我很猶豫,把它投入生產,並不知道是否會導致我的代碼庫的其他部分的問題。我也可以使用JDBC查詢,但是我必須用SQL語句的每個實例替換爲group_concat子句。

其他建議?

回答

2

是的,有兩點建議。或者:

  1. 補丁休眠3.2.0與HHH-3892的變化即獲得Hibernate的來源,應用補丁r16501r16823r17332),並建立自己的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解決了這個問題。 – 2010-09-23 18:03:28

+0

嗨...你有什麼想法'爲什麼'這可以緩解這個問題? – Victor 2011-03-04 21:49:44