ORACLE數(shù)據(jù)庫中,字段類型CHAR(8),值12345678
hibernate中用createSQLQuery方法查詢,返回的list用object[]接收,遍歷取值發(fā)現(xiàn)object[0]輸出值是1,只有一位,其他的沒了。其他字段正確。
---------------------------------------------
查看數(shù)據(jù)庫,發(fā)現(xiàn)其他字段包括VARCHAR,DATE等類型均無問題,只有char類型的出問題。
char類型是定義長度的,8代表8個字節(jié),節(jié)省空間并且效率要高,缺點是不靈活,長度是定死的,這里用來定義站號,固定8位長度。所以,該數(shù)據(jù)庫這個字段類型能解決問題,但不是最好的辦法,也沒找到真正原因。
-----------------------------------------------
查到現(xiàn)在,有了一些眉目,小結(jié)如下:
1,oracle的char字段在hibernate里映射為character類型,是varchar的子集。
2,復(fù)雜SQL用createSQLQuery方法查詢沒問題,如果查詢多個字段,遍歷用object[]造型,下標從0開始輸出值,不需要映射文件;如果愿意可以寫一個映射bean,方便取用。
3,如果查詢SQL中是只有一個字段,那就不能用object[]數(shù)組接收,只能用object類接收,直接輸出object.toString(),即是這個字段的值。
4,可以用addScalar(String arg,Type type)方法定義要返回的字段類型,如
s.createSQLQuery(shuiQingHQL).addScalar("STCD",Hibernate.STRING).addScalar("STNM");
這樣就解決了CHAR字段類型只出一位字符的問題。
但是需要把其他字段也addScalar()進來!
5,addScalar(String arg)里的參數(shù)是需要大寫的!
buffer.append(" select t1.id, t1.Mdn, t1.opType , t1.SubscriptionTime from GDCU_QUEUECDR t1, (select Mdn, max(SubscriptionTime) as t2time from GDCU_QUEUECDR group by Mdn) t2 where t1.Mdn =t2.Mdn and t1.SubscriptionTime =t2.t2time ");
//search.getWhereByMdisn(buffer, "su");
Query query = this.getSession().createSQLQuery(buffer.toString())
.addScalar("ID", Hibernate.INTEGER)
.addScalar("MDN", Hibernate.STRING)
.addScalar("OPTYPE",Hibernate.STRING)
.addScalar("SUBSCRIPTIONTIME",Hibernate.STRING);
List list = query.list();