今天在一个DAO中尝试对一个数据执行先查询再更新的操作,结果后台提示出现了sql语句
Hibernate: select group_id from fnd_groupid where id= ?
Hibernate: update fnd_groupid set group_id= ? where id = ?
本来是很简单的一个操作,但是数据库里面的值却始终不更新。
之前的代码如下:
SQLQuery query = this.getSession().createSQLQuery("select group_id from fnd_groupid where id= ?");
query.setLong(0, 1L);
Long nextVal = StringTools.parseLong(query.uniqueResult().toString());
SQLQuery queryUpdate = this.getSession().createSQLQuery("update fnd_groupid set group_id= ? where id = ? ");
queryUpdate.setLong(0, nextVal+1);
queryUpdate.setLong(1, 1l);
queryUpdate.executeUpdate();
后来google一下,才发现我的操作很有问题,我连续取出当前会话进行操作,前面的查询操作可以进行,但是此时会话还在进行中,我后面再次取到当前会话,并执行更新操作,这个操作始终无法完成。多次操作应该使用事务,只有提交事务之后才会生效。这其中涉及到hibernate的一级缓存机制。
这说明埋头写代码真的没啥用,原理的东西很多尚待研究,任重而道远~~
修改后的代码如下:
Session session = this.getSession();
Transaction transaction = session.beginTransaction();//启动事务
SQLQuery query = session.createSQLQuery("select group_id from fnd_groupid where id= ?");
query.setLong(0, 1L);
Long nextVal = StringTools.parseLong(query.uniqueResult().toString());
SQLQuery queryUpdate = session.createSQLQuery("update fnd_groupid set group_id= ? where id = ? ");
queryUpdate.setLong(0, nextVal+1);
queryUpdate.setLong(1, 1l);
queryUpdate.executeUpdate();
transaction.commit();
session.close();
return nextVal;
与Hibernate DetachedCriteria有关的分页问题
这是本人做项目数据库移植的时候遇到的一个最典型的问题,在查询总量的时候,会报如下错误
ORDER BY 子句中的列 "fnd_code.CODE_ID" 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。
当时百度google了很久,感觉网上都是泛泛而谈,没有从根源解决这个问题。下面就这个问题分析一下。
public List findPageByCriteria(DetachedCriteria criteria, int pageFirst, int pageMax){
log.debug("finding instance page by criteria");
try {
List results = getHibernateTemplate().findByCriteria(criteria, pageFirst, pageMax);
log.debug("find page by criteria successful, page size: "
+ results.size());
return results;
} catch (RuntimeException re) {
log.error("find page by criteria failed", re);
throw re;
}
}
这是BaseDao中的一个方法,使用hibernate管理数据库连接的时候,就是通过下面几行代码
getHibernateTemplate().findByCriteria(criteria, pageFirst, pageMax);
//其中,criteria是查询语句,pageFirst就是要查第几页,而pageMax就是总页数,hibernate会自动将这一页的内容取出来
来进行分页查询的。
但是在进行分页查询以前,必须要知道记录总数,以及分页信息,这个通常手动指定。知道这些信息后,再通过记录总数调整分页信息,调整方法如下:
public void adjustByTotalRow(int total){
totalRow = total;
if(totalRow < 1){
page = 0; //当前页
pageRow = 0; //页面记录数
totalPage = 0;//总页数
totalRow = 0;//总数据量
} else {
//设置总页数
totalPage = (totalRow / pageMax) + ((totalRow % pageMax) == 0 ? 0 : 1);
//调整页号
if(page > totalPage){
page = totalPage;
} else if(page < 1){
page = 1;
}
//计算页面记录数
pageRow = totalRow - (page - 1) * pageMax;
if (pageRow > pageMax){
pageRow = pageMax;
}
}
}
下面问题出来了,需要获得记录总数,最简单的代码如下所示
select count(*) from fnd_code order by code_id
但是令人蛋碎的是,一模一样的一个sql语句,在oracle中正常运行,但是sql server竟然报错,就是我上面贴出来的这个错误。分页的问题就是因为这个语句出来的。
在我的service中,进行如下调用,需要说明的是,现在传进来的criteria是有order的。
protected List findByPage(BaseDAO dao, DetachedCriteria criteria, PageMeta page) throws ServiceException{
if (page == null) {
return dao.findByCriteria(criteria);
} else {
int total = dao.findTotalByCriteria(criteria);//获取记录总数
if (total == 0) {
// no record found
return null;
}
page.adjustByTotalRow(total);//这个方法上面有贴出来,调整分页信息
// fetch the result page
if (page.getPage() < 1) {
// no fetch needed
return null;
}
List results = dao.findPageByCriteria(criteria,page.getPageFirstRow(), page.getPageMax());//分页查询
}
在service中,获取记录总数就会调用上面类似的sql语句,错误也就在此产生的。
啰嗦这么多,只是想也把分页的方法大致描述一下,方便理解。这个问题解决起来很简单,我们要把addOrder操作加到获取记录总数之后。下面是我修改的BaseService
protected Order order;//定义一个字段Order
/*此方法供外部调用,不再给criteria添加Order,而是将order给service
*/
public void addOrder(Order order){
this.order = order;
}
protected List findByPage(BaseDAO dao, DetachedCriteria criteria, PageMeta page) throws ServiceException{
if (page == null) {
return dao.findByCriteria(criteria);
} else {
int total = dao.findTotalByCriteria(criteria);
if (total == 0) {
// no record found
return null;
}
if(order != null){
criteria.addOrder(order);//获取记录总数以后,再将order加入
}
// adjust the page meta info by the actual total
page.adjustByTotalRow(total);
// fetch the result page
if (page.getPage() < 1) {
// no fetch needed
return null;
}
List results = dao.findPageByCriteria(criteria,page.getPageFirstRow(), page.getPageMax());
}
作了如下调整后,分页问题不复存在,当然我的方法可能不太好,如果哪位朋友有不同解决办法,可以留言交流,谢谢。
今天处理日期时发现一个问题,日期越减越大,为啥?
原来是基本数据类型的问题,Java默认数值类型为int型,下面的运算超出范围,越界之后数值变为负数,因此出现这个问题。
sDate.setTime(eDate.getTime() - 180*24*60*60*1000);
应该在后面加上类型转换:
sDate.setTime(eDate.getTime() - 180*24*60*60*1000 L);
这种类型的错误太蛋疼了~~
分享到:
相关推荐
《随手记 Android 源代码解析与学习指南》 随手记是一款广受欢迎的个人财务管理应用,其Android版本的源代码提供了深入理解移动应用开发的宝贵资料。这份源代码的公开,为开发者提供了一个实践和研究Android应用...
《深入剖析Android随手记记账应用源码》 在当今移动互联网时代,记账类应用已经成为许多用户日常生活中的必备工具,而"随手记记账应用"则是其中的佼佼者。通过对这款应用的源码进行深入研究,我们可以了解到Android...
标题 "随手记录身边的技术问题" 暗示了这是一个关于日常技术解决方法的集合,可能是作者在工作中遇到并解决的问题记录。这篇博文链接虽然没有提供具体的内容,但从标签 "源码" 和 "工具" 可以推测,文章可能涵盖了...
在本压缩包“一些爬虫基础和python基础随手记练习.rar”中,包含的是关于Python编程语言的基础知识以及网络爬虫技术的学习资料。Python是一种高级、通用的编程语言,因其简洁明了的语法而受到广大程序员的喜爱,尤其...
《随手记app2小程序开发详解》 在移动互联网时代,小程序因其轻量级、便捷的特性,成为开发者和用户喜爱的交互方式。本资源“随手记app2小程序.zip”提供了一个名为"MyMoney-master"的代码库,是随手记App的小程序...
【基于安卓软件的班组“随手记”应用】 随着信息技术的发展,电力行业的班组管理也开始逐步引入信息化手段,以提高工作效率和管理水平。本文主要讨论了如何利用安卓软件开发一款名为“随手记”的应用,来改善电力...
【小程序源码 仿随手记的炫酷饼图.rar】是一个包含小程序源代码的压缩包,主要用于实现类似随手记应用中的炫酷饼图展示功能。在这个项目中,开发者可能使用了微信小程序(WeChat Mini Program)的开发框架,这是一种...
在描述的"dd_2015级A考试题随手记dd1"中,我们看到几个关键的知识点,它们涵盖了软件工程的不同方面,包括软件测试、软件设计和维护。下面将详细讨论这些知识点。 首先,软件测试是确保软件质量的关键步骤。描述中...
该压缩包文件“应用源码之仿随手记的炫酷饼图.zip”是针对Android开发者的教育资源,旨在帮助他们学习如何在自己的应用中实现类似随手记的炫酷饼图效果。这里,我们将深入探讨Android应用开发,特别是涉及到的Java...
【Android随手记记账应用源码】是一款专为Android平台设计的开源记账软件,它提供了用户友好的界面和便捷的记账功能。通过分析这款应用的源代码,我们可以深入理解Android应用程序的开发过程,以及如何实现财务管理...
这篇文档将深入解析《Android 随手记记账应用源码》的相关知识点,主要涉及Android应用程序开发、Java编程语言以及Apache的相关应用。这个源码资源对于想要学习Android应用开发,特别是财务记账类应用的开发者来说,...
这篇文档将深入解析《Android随手记记账应用源码》这一毕业设计项目,旨在帮助学习者理解Android应用的开发流程,提升对Android编程的理解。这个项目涵盖了Android开发中的多个核心知识点,包括用户界面设计、数据...
然而,出现了一个404错误,表示浏览器无法找到`dojox.grid.Grid`的资源,这通常是因为路径配置问题或者缺少相应的模块。 首先,Dojo的加载机制基于模块化系统(AMD,Asynchronous Module Definition),它依赖于`...
同时,你可以使用Eclipse的调试工具来查找和修复错误,例如设置断点、查看变量值以及步进执行代码。 一旦准备好,你可以使用Eclipse内置的AVD(Android Virtual Device)管理器来创建和管理虚拟设备,用于在没有...
- **错误调试**:无论是Java、Python、C++还是JavaScript,开发者都需要处理运行时错误、语法错误或是逻辑错误。理解并解决这些问题有助于提高代码质量。 - **性能优化**:代码执行效率、内存占用等都是需要注意的...
自个随手记的笔记,如有错误,欢迎指正
在IT行业中,自动化工具是提升效率、减少人工错误的关键元素,尤其在软件测试领域更是如此。"HSAE"(可能代表"Highly Specialized Automation for Efficient Execution")似乎是一款专为自动化设计的工具,其目标是...
失败时分析错误,找出改进的方法,以避免重复犯错。这有助于教师形成个人的教学风格,并不断提升教学质量。 2. **录教学机智**:面对不同孩子的反应和课堂突发情况,教师需要灵活应对。记录这些机智的瞬间,能够...
1、随手记。 2、随手拍。 3、文件夹管理。 4、登录、用户切换。 5、同步文件夹。 6、批量上传、下载。 7、拍照图片质量设置。 8、用户反馈。 新增: 1、查看笔记:笔记分享。 2、...
开发模式是Struts2的一种配置,它提供了详细的错误报告和调试信息,方便开发者进行快速的故障排查和开发过程中的问题定位。 4. **Convention plugin "零配置"**: Convention插件使得Struts2可以实现“零配置”...