Hibernate createSQLQuery 查詢char類型結果爲一個字符解決方法彙總

在使用Hibernate的原生態SQL對Oracle進行查詢時,碰到查詢char類型的時候始終返回的是一個字符,開始認爲應該是Hibernate在作映射的把數據類型給映射成char(1),在通過查找網上的一些資料,得知產生這個問題的主要緣由確實是Hibernate再查詢Oracle的時候,將char自動映射成character(varchar的子集)類型,oracle的char字段在hibernate裏映射爲character類型,是varchar的子集。 現有如下幾種解決方法: 

1:將你要查詢的實體轉換成實體Bean 

使用HQL查詢,每一個表都有映射文件配置,反向工程生成的映射文件裏對於多字符的char會自動映射到java中的string類型。這樣就不存在字段映射的問題了,可是這樣不能使用SQL;  java


2:可使用Hibernate中的addScalar(String arg,Type type)來自定義返回字段的類型 ,如: 


this.getSession().createSQLQuery("select id,name,state from tb") 
.addScalar("id", Hibernate.STRING)
.addScalar("name", Hibernate.STRING)

.addScalar("state", Hibernate.STRING
).list();


這樣就能夠解決,可是這樣的話,必須把全部要查詢的字段進行定義,在字段比較多的時候,就相對比較麻煩;  git

3:在Oracle查詢語句中直接指定數據格式 ,如: 


select id,name,cast(state as varchar(2)) from tb 

這種解決方法比較方便,只須要在查詢語句指定char的返回類型,推薦使用這種方法進行查詢。
數據庫

四、修改hibernate默認的char映射類型

經過重寫繼承其方言類實現。自定義Hibernate Dialect.我用的數據庫是ORACLE,:

首先建一個類,繼承com.digitwater.fwk.hibernate.Oracle9iDialect,該類的內容以下: oracle

public class MySQLDialect extends MySQL5Dialect {
	public MySQLDialect() {
		super();
		registerHibernateType(Types.CHAR, Hibernate.STRING.getName()); 
	}
	
}

第二步,就是修改hibernate的配置文件hibernate.cfg.xml: 函數

將:<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop> this

改成:<prop key="hibernate.dialect">com.fy.mgr.support.MySQLDialect</prop> spa


此方法改動是最小的。目前使用正常,暫時沒發現其它問題。

五、 Hibernate中將SQL查詢出來字段轉換爲對象的方法有兩種

1.使用ResultTransformer,代碼以下
query.setResultTransformer(new AliasToBeanResultTransformer(StudentDTO.class)).list()

這種方法要求數據庫的字段名和類的屬性的大小寫必須一致,可是Oracle查詢返回的字段名卻全是大寫。  hibernate

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

附:oracle cast()函數用法:

cast 是進行類型轉換的, 能夠針對各類Oracle數據類型. 修改的是用戶的數據類型. code

round只是修改的數據顯示格式. 對數據作四捨五入. 相似的函數還有ceil(取此數據的最小整數). trunc( 取整函數.) orm

SQL> create table t1(a varchar(10));

Table created.

SQL> insert into t1 values ('12.3456');

1 row created.

SQL> select round(a) from t1;

ROUND(A)
----------
12

SQL> select round(a,3) from t1;

ROUND(A,3)
----------
12.346

SQL> select cast(a as int) from t1;

CAST(AASINT)
------------
12

SQL> select cast(a as number(8,4)) from t1;

CAST(AASNUMBER(8,4)) -------------------- 12.3456

相關文章
相關標籤/搜索