Hibernate使用count(*)取得表中记录总数

Java代码  

  1. /**
  2. * @TODO:查询某一年度的所有计划数量
  3. */
  4. public int findCountByYear(String currYear) {
  5. String hqlString = "select count(*) from WaterPlan as p where p.planYear =‘"+currYear+"‘";
  6. Query query = this.getSession().createQuery(hqlString);
  7. return ((Number)query.uniqueResult()).uniqueResult();
  8. }

从Hibernate 3.0.x/3.1.x升级到最新的3.2版之后,3.2版的很多sql函数如count(), sum()的唯一返回值已经从Integer变为Long,如果不升级代码,会得到一个ClassCastException。

这个变化主要是为了兼容JPA,可以在hibernate.org的最新文档中找到说明。

Hibernate Team也提供了一个与原来兼容的解决方案:

Java代码  

  1. Configuration classicCfg = new Configuration();
  2. classicCfg.addSqlFunction( "count", new ClassicCountFunction());
  3. classicCfg.addSqlFunction( "avg", new ClassicAvgFunction());
  4. classicCfg.addSqlFunction( "sum", new ClassicSumFunction());
  5. SessionFactory classicSf = classicCfg.buildSessionFactory();

Java代码  

  1. //int count = ((Integer)query.uniqueResult()).intValue();
  2. //改成
  3. int count = ((Number)query.uniqueResult()).intValue();
  4. //这样就可以两个版本同时兼容.

Java代码  

    1. //参考代码
    2. //第一种方法:
    3. String hql = "select count(*) from User as user";
    4. Integer count = (Integer)getHibernateTemplate().find(hql).listIterator().next();
    5. return count.intValue();
    6. //第二种方法:
    7. String hql = "select count(*) from User as user";
    8. return ((Integer)getHibernateTemplate().iterate(hql).next()).intValue();
    9. //第三种方法:
    10. String hql = "select count(*) from User as user";
    11. Query query =  getHibernateTemplate().createQuery( getSession(),hql);
    12. return ((Integer)query.uniqueResult()).intValue();
时间: 2024-11-11 14:35:31

Hibernate使用count(*)取得表中记录总数的相关文章

Oracle查看某个用户下所有表的记录总数和所有表的字段总数、记录数

https://blog.csdn.net/zhihaoma/article/details/78607368 如我想查看用户M下的所有表的总记录数: SELECT SUM(num_rows) FROM SYS.ALL_TABLES T WHERE T.OWNER = 'M';1但是查出的不是实时记录数. 如果想查看用户M下所有表的字段总数: SELECT * FROM SYS.dba_TAB_columns T WHERE T.OWNER = 'M';1Oracle查询数据库中所有表的记录数:

mysql学习笔记——对数据表中记录的操作

对记录的操作,主要有增.删.改.查 一.记录插入命令:insert into 表名(列名,列名, .... ) values(值, 值, ....); 值个数应该列个数相同,值顺序和列顺序相同,值类型和列字段类型匹配 当表名后面省略列名时,values后面要给出所有列的值 插入数据时,字符串添加 单引号 '' ---- 字符型和日期型数据应包含在单引号中 插入数据时,中文乱码问题:将客户端的编码集设置为gbk 修改mysql 配置文件,永久改变客户端编码集 ----- mysql/my.ini

sql 循环表中记录

=========================================================================循环排序查询数据============================================================= 这个写的是个函数,以便存储过程中调用!USE [数据库名称]GO/****** Object: UserDefinedFunction [dbo].[GetServer] Script Date: 05/22/20

选取不在另一张表中记录的方法及优化

假设我们想从A表中选择一些记录,记录中的部分字段的取值是B表所不存在的,这里定义A表为源表,B表为参照表.例如,常见的例子部门表(Department)作为源表,员工表(Employee)作为参照表,可以从部门表中列举出那些员工表中所不包含的部门id来,即找出那些没有员工的部门.    一般类来说,如果数据库支持集合操作符,就可以直接查询,如果没有,就使用子查询.(1)DB2 and PostgreSQL:select deptno from deptexceptselect deptno fr

【转】MySQL数据表中记录不存在则插入,存在则更新

mysql 记录不存在时插入在 MySQL 中,插入(insert)一条记录很简单,但是一些特殊应用,在插入记录前,需要检查这条记录是否已经存在,只有当记录不存在时才执行插入操作,本文介绍的就是这个问题的解决方案. 问题:我创建了一个表来存放客户信息,我知道可以用 insert 语句插入信息到表中,但是怎么样才能保证不会插入重复的记录呢? 答案:可以通过使用 EXISTS 条件句防止插入重复记录. 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的

工作同时删除2张表中记录

mysql: delete a.*,b.* from sys_z_info a,sys_o_info b where a.z_id=b.d_id and a.z_id='123456' 这个呢在只有1张表中有记录的时候不会起作用,不过可以考虑这样做:delete a.*,b.* from sys_z_info a,sys_o_info b where (a.z_id=b.d_id and a.z_id='123456' ) or  a.z_id='123456';这样就可以避免b中没有数据时不做

表中记录查询排序(设置排序规则)

--先创建一个表 create table ai( id int not null, no varchar(10) not null ) go --往表中插入数据 insert into ai  select 105,'2'  union all  select 105,'1'  union all  select 103,'1'  union all  select 105,'4' go --查询效果如下: select * from ai go id          no         

chunk writer 中需要对抛错的交易进行回滚,同时又要在其他表中记录是哪一笔交易记录失败

首先根据我有限的知识判断,回滚之后进行写表,该写表动作只能使用listener来进行. 考虑使用的listener有:ItemWriteListener     StepExecutionListener    ChunkListener 我首先使用了ItemWriteListener,在 onWriteError(Exception exception, List items) 方法中对items进行了写表,后来发现被回滚,通过一步一步debug,看到确实该方法之后才是rollback. 所以

在有序数据表中实现多记录上移下移置顶置底算法思路

引言 数据库应用中常需要在一个有序数据子集中,对指定的若干条记录进行上下移动.例如,管理员需要对新闻列表中的若干条新闻置顶,考试出卷时需要对选定题目进行上下移动重排顺序,等等. 总的应该场景在数据表中可以概括为如下模型: 数据表 TblData(id,fid,rank),id表示记录的唯一标识,fid指记录的父节点,rank代表父节点下兄弟的前后顺序,依次从1递增,没有空隙. 问题是要对相同fid下选中的若干个节点进行上下移动,如图1中的2个示例: 图 1 上移操作示例图 左侧示例是对第5.6两