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

在Hibernate中若是經過 數據庫


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

查詢,返回值中只會有一個「合」字。 app

經查,常量在數據庫中被認爲是CHAR類型的,Hibernate取值時將其保存爲Character類型,而Character只能保存一個字符,因此形成返回值中只存在一個字符。Hibernate官方已存在此bug ,卻從未修復。 spa

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

1.繼承一個Dialect,並註冊CHAR類型的對應方式。代碼以下 orm


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() 
  get

還有一種解決方法是在SQL中設置該字段的類型,代碼以下 it


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...的格式。

相關文章
相關標籤/搜索