`

Hibernate使用count(*)取得表中记录总数(跨Hibernate3.x版本问题)

阅读更多
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.            
  8.     return ((Number)query.uniqueResult()).uniqueResult();   
  9. }  
/**
  * @TODO:查询某一年度的所有计划数量
  */
public int findCountByYear(String currYear) {
    String hqlString = "select count(*) from WaterPlan as p where p.planYear ='"+currYear+"'";
    Query query = this.getSession().createQuery(hqlString);
		
    return ((Number)query.uniqueResult()).uniqueResult();
}

 从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();   
Configuration classicCfg = new Configuration(); 
classicCfg.addSqlFunction( "count", new ClassicCountFunction()); 
classicCfg.addSqlFunction( "avg", new ClassicAvgFunction()); 
classicCfg.addSqlFunction( "sum", new ClassicSumFunction()); 
SessionFactory classicSf = classicCfg.buildSessionFactory(); 

 
或 

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

int count = ((Number)query.uniqueResult()).intValue(); 

//这样就可以两个版本同时兼容. 

  

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. //第二种方法:   
  8.  String hql = "select count(*) from User as user";   
  9.   return ((Integer)getHibernateTemplate().iterate(hql).next()).intValue();   
  10.   
  11. //第三种方法:   
  12.  String hql = "select count(*) from User as user";   
  13.  Query query =  getHibernateTemplate().createQuery( getSession(),hql);   
  14.  return ((Integer)query.uniqueResult()).intValue();   
分享到:
评论

相关推荐

    Hibernate各种查询:联表查询 分页查询 位置参数查询(?) 占位符查询(冒号查询) 统计查询

    在Hibernate中,可以使用`Criteria` API或者`HQL`(Hibernate Query Language)来实现多表联查。`Criteria` API提供了更加面向对象的查询方式,通过`createCriteria()`方法指定主表,然后使用`createAlias()`方法...

    Hibernate问题解决

    - **RIGHT JOIN:** 直接在HQL中使用`RIGHT JOIN`语法,但由于Hibernate不支持直接的`RIGHT JOIN`语法,可以使用`LEFT JOIN`加上额外的条件来模拟`RIGHT JOIN`的效果: ```java String hql = "FROM UserInfo u ...

    hibernate查询

    1. **实体映射**: 在Hibernate中,Java类被映射到数据库表,对象实例对应表中的记录。通过`@Entity`注解标记实体类,`@Table`指定对应的表名,`@Id`标识主键字段。 2. **Session接口**: Hibernate的核心接口,用于...

    hibernate basedao(泛型版本)

    泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数,从而实现更强大的类型检查和减少类型转换的冗余。 1. 泛型BaseDAO:`GenericBaseDao.java`和`GenericBaseDaoInter.java` 泛型BaseDAO的主要...

    Hibernate_query聚合函数查询.

    例如,如果你想要查询一个表中所有记录的总数,可以使用`COUNT`函数: ```java Query query = session.createQuery("SELECT COUNT(*) FROM EntityName"); Long totalCount = (Long) query.uniqueResult(); ``` ...

    hibernate 中HQL语句查询学习笔记

    左外抓取连接是左外连接的一种特殊形式,主要用于获取左表记录的关联数据: ```hql SELECT s, c FROM Student s LEFT OUTER JOIN FETCH s.courses c; ``` 这里使用了`FETCH`关键字来立即加载关联数据。 ##### 右...

    Struts2 + Spring2 + Hibernate3经典分页(包含java及jsp源码)

    3. **获取当前页数据**:利用`countOff()`方法计算当前页的起始记录位置,然后使用Hibernate或其他数据库操作方式查询对应范围内的数据。 4. **判断页面状态**:通过`init()`方法更新页面状态,判断当前页是否为第...

    Hibernate通用分页.docx

    【Hibernate 通用分页】 ...以上代码展示了如何在实际项目中使用`BaseDao`类实现Hibernate的分页查询。请注意,这只是一个基本示例,实际应用可能需要考虑更多细节,例如错误处理、事务管理、性能优化等。

    hibernate查询语句--HQL

    Hibernate 是一个开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而简化了数据访问逻辑。在 Hibernate 中,执行查询操作的主要方式之一是使用 Hibernate 查询语言(HQL)。 ...

    Hibernate数据查询

    Hibernate支持COUNT、AVG、MAX、MIN和SUM等统计函数,可以用于计算总数、平均值等。 7. **缓存机制** 为了提高查询性能,Hibernate使用了二级缓存。一级缓存是Session级别的,自动管理,而二级缓存可以跨Session...

    Hibernate实现记录的增、删、改和查功能

    这段代码会返回 User 表中的记录总数。 1.5 **限制查询起始值和数量**: ```java String hql = "from User as user order by user.loginName"; int firstResult = 50; int maxResults = 50; Query query = session....

    Hibernate HQL查询.docx

    HQL 的基本结构类似于 SQL 的 `SELECT FROM` 结构,不同之处在于 HQL 中使用的是类名和属性名而非表名和字段名。 ##### 示例:基本查询 ```java String hql = "FROM User"; Query query = session.createQuery(hql)...

    hibernate sturts 分页 通用

    3. **分页逻辑**:根据分页参数和总数,我们可以计算出当前页的起始位置和结束位置,然后构造出对应的SQL查询语句(例如`SELECT * FROM table LIMIT start, pageSize`),在Hibernate中,这可以通过HQL(Hibernate ...

    JAVASQL面试题目.pdf

    11. **SQL日期判断**:获取`tb_send`表中日期为当前日期的所有记录,可以使用如下SQL:`SELECT * FROM tb_send WHERE DATE(SendTime) = CURDATE();` 12. **复制表结构**:创建新表并复制旧表结构但不复制数据:`...

    高效率spring+struts+hibernate分页算法

    1. **getTotalCount**: 使用Hibernate查询数据库获取记录总数。 2. **getList**: 执行分页查询并返回结果集。 ```java public class Paginate extends HibernateDaoSupport implements PaginateInterface { // ...

    课程hibernate查询集合.pdf

    - `count()`:计算记录数量,如`select count(*) from Student`将返回`Student`实例的总数。 - `min()`:找出最小值,如`select min(s.age) from Student as s`将返回`Student`年龄的最小值。 - `max()`:找出...

    spring+struts+hibernate分页

    类中的方法用于获取和设置这些属性,例如`getCount()`、`setCount()`等,便于在代码中使用和传递分页参数。 2. **实现分页逻辑**: - **计算总页数**:当`count`(记录总数)和`pageSize`(每页记录数)已知时,...

Global site tag (gtag.js) - Google Analytics