分享

hibernate原生sql封装,报错信息:could not find setter for rownum

 瀚海璨夜 2019-01-16
报错信息:could not find setter for rownum_

还原现场:在mysql环境下,以下代码,在mysql下运行正常,但是切换到oralce,报出找不到STUDENTNAME属性的错误。
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();  


分析:原来是oracle自动将列映射的studentName转换为大写的STUDENTNAME,所以不能映射,报类找不到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 ;

还有一种方式解决,就是使用双引号将别名包裹起来,感觉不是很优雅。像这样
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设置起始记录,setMaxResult设置结束记录 sql里有用分组函数,返回非持久化对象  当firstResult=0,正常,当firstResult>0时,报错。  大家是否遇到过?
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. }  

问题补充:报错信息:could not find setter for rownum_

用createSQLQuery的方式,查询的结果setResultTransformer()了一下。
并且设置了firstResult和MaxResult.

现象:
当firstResult为0的时候,一切正常,当firstResult不为0的时候报 “could not find setter for rownum_”的错误
如果不setResultTransformer,设置的firstResult和MaxResult不受影响。

主要是改sql
1、别名要大写
如:select day DAY,count(id) COUNT from t_name group by day
像楼下给的链接的解释,oracle自动将别名大写,但是如果自己设置了小写的,就会出现上面的问题。 为了避免addScalar多个,建议将别名直接大写。
2、当然你可以采用多个addScalar,这样只会,你就不能封装为通用的dao了。 

使用addSalar方法是,报错如下:
 IllegalArgumentException occurred while calling setter of  “包名.bean类名”

解决方法:设置查询出来的字段的类型
  • query.addScalar("productId", StandardBasicTypes.STRING);//要查询出来的字段、类型
    • 本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
      转藏 分享 献花(0

      0条评论

      发表

      请遵守用户 评论公约

      类似文章 更多