`

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

 
阅读更多
报错信息:could not find setter for rownum_

还原现场:在mysql环境下,以下代码,在mysql下运行正常,但是切换到oralce,报出找不到STUDENTNAME属性的错误。
List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .list();


分析:原来是oracle自动将列映射的studentName转换为大写的STUDENTNAME,所以不能映射,报类找不到STUDENTNAME的set方法。
解决办法:添加addScalar方法,代码如下:

List resultWithAliasedBean = s.createSQLQuery(
  "SELECT st.name as studentName, co.description as courseDescription " +
  "FROM Enrolment e " +
  "INNER JOIN Student st on e.studentId=st.studentId " +
  "INNER JOIN Course co on e.courseCode=co.courseCode")
  .addScalar("studentName")
  .addScalar("courseDescription")
  .setResultTransformer( Transformers.aliasToBean(StudentDTO.class))
  .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 ;

还有一种方式解决,就是使用双引号将别名包裹起来,感觉不是很优雅。像这样
String sql = "select id as \"id\",iata as \"iata\",flight as \"flight\",dest as \"dest\",domint as \"domint\" " + 
            " ,sdt as \"sdt\",task_nature as \"taskNature\",est_date as \"estDate\",act_date as \"actDate\",remark as \"remark\" " + 
            " from FIDS_DEPF";



createSQLQuery  setFirstResult设置起始记录,setMaxResult设置结束记录 sql里有用分组函数,返回非持久化对象  当firstResult=0,正常,当firstResult>0时,报错。  大家是否遇到过?
public List findBySql(String sql, List params, int pageNo, int pageSize,
Class clazz) {
SQLQuery sqlQuery = getCurrentSession().createSQLQuery(sql);
if (params != null && !params.isEmpty()) {
for (int i = 0, size = params.size(); i < size; i++) {
sqlQuery.setParameter(i, params.get(i));
}
}
sqlQuery.setFirstResult((pageNo - 1) * pageSize);
sqlQuery.setMaxResults(pageSize);
sqlQuery.setResultTransformer(Transformers.aliasToBean(clazz));
return sqlQuery.list();
}

问题补充:报错信息: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了。 

2
0
分享到:
评论

相关推荐

    学生课绩管理系统jsp+servlet+javaBean+sql_server

    在学生课绩管理系统中,JavaBean可以作为数据模型,封装学生的个人信息和成绩数据,提供getter和setter方法供其他组件调用,增强了代码的复用性和可维护性。 4. SQL Server数据库:作为后台数据存储,SQL Server...

    Typesetter_php_

    8. **日志和统计**:系统可能会记录用户的操作,同时提供访问统计信息,帮助管理员监控网站的使用情况。 9. **安全防护**:通过密码保护、登录尝试限制、定期备份和安全更新等方式,保护网站免受恶意攻击。 10. **...

    Hibernate映射导致的几个异常

    标题与描述概述的知识点主要集中在Hibernate映射过程中可能遇到的各种异常情况,这涉及到数据库与对象模型之间的映射问题,以及Hibernate框架在处理这些映射时可能产生的错误。下面将对这些异常进行详细的解释和分析...

    获取封装类的私有属性

    在编程领域,尤其是在面向对象编程(OOP)中,封装是核心概念之一。它涉及到将数据和操作这些数据的方法捆绑到一个独立的单元——类中,以保护数据的安全性。私有属性是类中的一种特性,它们是隐藏的,不能直接从类...

    使用hibernate对sqlserver 2005进行增删改查

    在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式来操作数据库,而无需直接编写SQL语句。在这个场景中,我们将探讨如何使用Hibernate与SQL Server 2005数据库进行...

    Hibernate错误及解决办法集合

    **问题描述**:执行Hibernate查询语句时,系统提示`couldnotexecutequery`错误,并附带有SQL语法错误的信息。 **可能原因**:这类错误通常是由SQL语法错误引起的,具体包括但不限于: 1. **关键字冲突**:数据库中...

    使用Hibernate访问sqlserver数据库

    **使用Hibernate访问SQL Server数据库** Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在关系数据库和面向对象编程之间架起桥梁的方式。通过使用Hibernate,我们可以避免编写大量的SQL...

    Python-图文课件12.pptx

    Python 面向对象编程 - 封装、继承和多态 在 Python 中,面向对象编程是一种非常重要的编程范式。它提供了封装、继承和多态等机制来帮助开发者更好地组织和复用代码。在本节课中,我们将学习 Python 中的封装、继承...

    Java_StructureBuilder_forC:半自动构造函数,以生成C语言的结构,以及它们的构造函数,getter和setter

    C的结构生成器[用Java编码]。 先进的改进和发展: FacuFalcone-CaidevOficial [Java]。 主意: 圣地亚哥·埃雷拉·布尔戈斯[C语言]。 private static String StartCourse(){ String message = " Keep Learning and...

    用类来封装学生的信息

    根据给定的文件标题“用类来封装学生的信息”及描述来看,虽然示例代码实际上并未涉及学生信息的封装,而是展示了如何通过类来管理包裹信息(包括普通包裹、两天到达包裹以及次日达包裹)。这里我们将重点放在理解类...

    hibernate常见问题及处理.doc

    3. `net.sf.hibernate.PropertyNotFoundException: Could not find a setter for property name in class …` 这个异常表示Hibernate无法找到Java类中与XML映射文件中指定的属性相对应的getter或setter方法。确保...

    reactivity.esm-bundler.js

    vue新建项目出现问题 替换这个文件

    android 评论页面listview实现

    // 构造函数、getter和setter方法... } ``` 接下来,创建一个适配器(如CommentAdapter.java),将Comment对象转换为ListView可显示的视图: ```java public class CommentAdapter extends ArrayAdapter&lt;Comment&gt;...

    hibernate常见错误解决方案

    **PropertyNotFoundException: Could not find a setter for property name in class hibernate.Hello_Bean** **异常描述:** 此异常表明Hibernate试图为实体类中的某个属性设置值时找不到对应的setter方法。 **...

    Hibernate学习.pdf

    - **概念**: Hibernate的设计遵循面向对象的思想,将实体对象和数据库之间的转换封装在内部。 #### 3. 持久化类(Persistent Classes) - **定义**: 持久化类是指与数据库中的表相对应的Java类。 - **要求**: 必须有...

    jdbc_Hibernate总结

    Hibernate是一个流行的ORM(Object-Relational Mapping)框架,它为开发者提供了对JDBC的轻量级封装,简化了数据库操作。使用Hibernate,开发者可以更专注于业务逻辑,而不是底层的SQL语法。在搭建Hibernate项目时,...

    Hibernate几个常见错误解决方式

    错误信息:`could not resolve property: trackDate of: ookj.domain.TjReagentTrack` 这个错误通常是因为Hibernate找不到实体类`TjReagentTrack`中名为`trackDate`的属性。这可能是由于映射配置错误,比如在配置...

    圣诞树python-31-获取和修改私有属性值.ev4.rar

    在Python编程语言中,私有属性(private attributes)是一种封装机制,用于限制对象内部状态的直接访问,以保护数据的完整性。本教程“圣诞树python-31-获取和修改私有属性值”将深入探讨如何在Python中处理私有属性...

    Gidot_Typesetter_3.0.6.rar

    软件名称:排版助手 GIDOT TYPESETTER 当前版本:3.0.6 作者:GIDOT 邮箱:GIDOT@VIP.QQ.COM 网站:WWW.GIDOT.CN/TYPESETTER 新增功能: ·批量排版功能 ·多文本文件合并成单一文本文件 功能改进: ·将排版工具...

Global site tag (gtag.js) - Google Analytics