Hibernate通過SQL查詢常量時只能返回第一個字元的解決方法

cyzero發表於2012-12-05

在Hibernate中如果通過

session.createSQLQuery("select '合計' as name from dual").list()

查詢,返回值中只會有一個“合”字。

經查,常量在資料庫中被認為是CHAR型別的,Hibernate取值時將其儲存為Character型別,而Character只能儲存一個字元,所以造成返回值中只存在一個字元。Hibernate官方已存在此bug,卻從未修復。

該bug中給出2中解決方法:

1.繼承一個Dialect,並註冊CHAR型別的對應方式。程式碼如下

    public class MySQLServerDialect extends org.hibernate.dialect.SQLServerDialect  
    {  
        public MySQLServerDialect()  
        {  
            super();  
            //very important, mapping char(n) to String  
            registerHibernateType(Types.CHAR, Hibernate.STRING.getName());  
        }  
    }  

2.設定欄位對應的型別(缺點是如果查詢很多欄位,每個欄位都必須設定,沒設定型別的欄位在結果集中是不存在的),程式碼如下
session.createSQLQuery("select '合計' as name from dual").addScalar("name", Hibernate.STRING).list()

還有一種解決方法是在SQL中設定該欄位的型別,程式碼如下
session.createSQLQuery("select cast('合計' as varchar(4)) as name from dual").list()

該方法在Oracle和SQL Server中可用。

 

Hibernate中將SQL查詢出來欄位轉換為物件的方法有兩種

1.使用ResultTransformer,程式碼如下

query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()

這種方法要求資料庫的欄位名和類的屬性的大小寫必須一致,但是Oracle查詢返回的欄位名卻全是大寫。

2.使用addEntity方法,這種方法的缺點是SQL必須寫成select * from users的形式或select {a.*},{b.*} from a,b where...的格式。



相關文章