日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

hibernate原生sql封裝,報(bào)錯(cuò)信息:could not find setter for rownum

 瀚海璨夜 2019-01-16
報(bào)錯(cuò)信息:could not find setter for rownum_

還原現(xiàn)場(chǎng):在mysql環(huán)境下,以下代碼,在mysql下運(yùn)行正常,但是切換到oralce,報(bào)出找不到STUDENTNAME屬性的錯(cuò)誤。
Sql代碼  收藏代碼
  1. List resultWithAliasedBean = s.createSQLQuery(  
  2.   "SELECT st.name as studentName, co.description as courseDescription " +  
  3.   "FROM Enrolment e " +  
  4.   "INNER JOIN Student st on e.studentId=st.studentId " +  
  5.   "INNER JOIN Course co on e.courseCode=co.courseCode")  
  6.   .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))  
  7.   .list();  


分析:原來(lái)是oracle自動(dòng)將列映射的studentName轉(zhuǎn)換為大寫的STUDENTNAME,所以不能映射,報(bào)類找不到STUDENTNAME的set方法。
解決辦法:添加addScalar方法,代碼如下:

Sql代碼  收藏代碼
  1. List resultWithAliasedBean = s.createSQLQuery(  
  2.   "SELECT st.name as studentName, co.description as courseDescription " +  
  3.   "FROM Enrolment e " +  
  4.   "INNER JOIN Student st on e.studentId=st.studentId " +  
  5.   "INNER JOIN Course co on e.courseCode=co.courseCode")  
  6.   .addScalar("studentName")  
  7.   .addScalar("courseDescription")  
  8.   .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))  
  9.   .list();  


Tip: the addScalar() calls were required on HSQLDB to make it match a property name since it returns column names in all uppercase (e.g. "STUDENTNAME"). This could also be solved with a custom transformer that search the property names instead of using exact match - maybe we should provide a fuzzyAliasToBean() method ;

還有一種方式解決,就是使用雙引號(hào)將別名包裹起來(lái),感覺(jué)不是很優(yōu)雅。像這樣
Sql代碼  收藏代碼
  1. String sql = "select id as \"id\",iata as \"iata\",flight as \"flight\",dest as \"dest\",domint as \"domint\" " +   
  2.             " ,sdt as \"sdt\",task_nature as \"taskNature\",est_date as \"estDate\",act_date as \"actDate\",remark as \"remark\" " +   
  3.             " from FIDS_DEPF";  



createSQLQuery  setFirstResult設(shè)置起始記錄,setMaxResult設(shè)置結(jié)束記錄 sql里有用分組函數(shù),返回非持久化對(duì)象  當(dāng)firstResult=0,正常,當(dāng)firstResult>0時(shí),報(bào)錯(cuò)。  大家是否遇到過(guò)?
Java代碼  收藏代碼
  1. public List findBySql(String sql, List params, int pageNo, int pageSize,  
  2. Class clazz) {  
  3. SQLQuery sqlQuery = getCurrentSession().createSQLQuery(sql);  
  4. if (params != null && !params.isEmpty()) {  
  5. for (int i = 0, size = params.size(); i < size; i++) {  
  6. sqlQuery.setParameter(i, params.get(i));  
  7. }  
  8. }  
  9. sqlQuery.setFirstResult((pageNo - 1) * pageSize);  
  10. sqlQuery.setMaxResults(pageSize);  
  11. sqlQuery.setResultTransformer(Transformers.aliasToBean(clazz));  
  12. return sqlQuery.list();  
  13. }  

問(wèn)題補(bǔ)充:報(bào)錯(cuò)信息:could not find setter for rownum_

用createSQLQuery的方式,查詢的結(jié)果setResultTransformer()了一下。
并且設(shè)置了firstResult和MaxResult.

現(xiàn)象:
當(dāng)firstResult為0的時(shí)候,一切正常,當(dāng)firstResult不為0的時(shí)候報(bào) “could not find setter for rownum_”的錯(cuò)誤
如果不setResultTransformer,設(shè)置的firstResult和MaxResult不受影響。

主要是改sql
1、別名要大寫
如:select day DAY,count(id) COUNT from t_name group by day
像樓下給的鏈接的解釋,oracle自動(dòng)將別名大寫,但是如果自己設(shè)置了小寫的,就會(huì)出現(xiàn)上面的問(wèn)題。 為了避免addScalar多個(gè),建議將別名直接大寫。
2、當(dāng)然你可以采用多個(gè)addScalar,這樣只會(huì),你就不能封裝為通用的dao了。 

使用addSalar方法是,報(bào)錯(cuò)如下:
 IllegalArgumentException occurred while calling setter of  “包名.bean類名”

解決方法:設(shè)置查詢出來(lái)的字段的類型
  • query.addScalar("productId", StandardBasicTypes.STRING);//要查詢出來(lái)的字段、類型
    • 本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶 評(píng)論公約

      類似文章 更多