在上一篇中,大致学习了hibernate的基本查询:HQL基本查询,今天,继续昨天的步伐,继续学习hibernate的基本查询。。。。。


1、hql聚合函数,先大致列一下hql的聚合函数有哪些吧:

在SQL中,我们的聚合函数也是这些,并且用法也相同 。继续昨天的方式,用一个函数来展示:

/**
* HQL 聚合函数的使用
*/
@Test
public void HQLAggregate(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
String hql="select min(stu.age) from Student stu";
Query query=session.createQuery(hql); @SuppressWarnings("rawtypes")
List list=query.list();
System.out.println(list.get(0)); tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
} }

需要注意的是,得到的结果是一个list集合,这样很方便的就可以使用操作集合的方法来进行结果的处理来。

2、HQL分组查询:关键字 group by:

通常,group by 会和聚集函数一起使用

/**
* HQL 分组函数
*/
@Test
public void gruopFunction(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
String hql="select count(stu.id),stu.clazz from Student stu group by stu.clazz having avg(stu.age)>20";
Query query=session.createQuery(hql);
@SuppressWarnings("unchecked")
List<Object[]> list=query.list();
for(Object[]objs:list){
for(Object obj:objs){
System.out.println(obj);
}
System.out.println("-----分组信息-------");
}
tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
} }

这里的hql语句应该不难理解,学过SQL的同学们应该都会嘀

3、分页查询:这个最实用来,在绝大多数的管理系统中,都会涉及到分页查询

Query接口提供以下两个用于分页显示查询结果的方法:

setFirstResult(int firstResult)

setMaxResult(int maxResults)

/**
* 分页查询
* @param pageNo 页数
* @param pageSize 分页大小
*/
public void selectByPage(int pageNo,int pageSize){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
String hql="from Student";
Query query=session.createQuery(hql).setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize);
@SuppressWarnings("unchecked")
List<Student> list=(List<Student>)query.list();
for(Student stu:list){
System.out.println(stu);
}
tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
} }

4、批量更新或者删除

在Hibernate3以后,HQL新增了update与delete语句,可以直接使用HQL指定更新或删除。

/**
* HQL 更新或者删除
*/
@Test
public void updateOrDelete(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
String hql="update Student set name='lixiaoyao' where id=:id";
Query query=session.createQuery(hql);
query.setInteger("id", 1);
int i=query.executeUpdate();
System.out.println(i);
if(i>0){
System.out.println("更新成功");
}else{
System.out.println("更新失败");
}
tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
} }

如果是删除的话,只需将上面的hql改为:

String hql = "DELETE  Student  WHERE name = :id";
Query query = session.createQuery(hql);
query.setInteger(“id”,1);
int count = query.executeUpdate();

5、hibernate命名查询

hibernate的命名查询需要把查询语句写到关系对象映射文件中,此处,将下面的配置信息写到Student.hbm.xml文件中

<!-- 配置hibernate的命名查询 -->
<!-- name属性是必须的 -->
<query name="studentHql">
<!-- CDATA告诉xml的解析器不要解析它后面[]中的内容,而其中的内容就是HQL语句 -->
<![CDATA[from Student]]>
</query>

需要注意的是:<query>标签是和<class> 标签同级的,如果不是会抛出异常,命名查询语句可以是HQL语句,也可以是本地SQL语句,程序代码也不区分命名查询语句的类型,一律通过Session的getNameQuery()方法来获得查询语句

/**
* HQL的命名查询方式
*/
@Test
public void selectByNamed(){
Transaction tx=null;
Session session=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
Query query=session.getNamedQuery("studentHql");
@SuppressWarnings("unchecked")
List<Student> list=(List<Student>)query.list();
for(Student stu:list){
System.out.println(stu);
}
tx.commit();
}catch(HibernateException he){
if(tx!=null){
tx.rollback();
}
he.printStackTrace();
}finally{
HibernateUtils.closeSession(session);
} }

好吧!hibernate的基本查询到这里就结束来,自我感觉还是很轻松的,当然,毕竟是很基础的东西咯。

hibernate学习系列-----(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及命名查询的更多相关文章

  1. sqlserver 模糊查询,连表,聚合函数,分组

    use StudentManageDB go select StudentName,StudentAddress from Students where StudentAddress like '天津 ...

  2. hibernate学习系列-----(2)hibernate核心接口和工作机制

    在上一篇文章hibernate学习系列-----(1)开发环境搭建中,大致总结了hibernate的开发环境的搭建步骤,今天,我们继续了解有关hibernate的知识,先说说这篇文章的主要内容吧: C ...

  3. ef实现一次查询多个聚合函数的字段

    想用ef来写一个统计字段的语句,如下所示 select sum(price) as price_total, sum(amount) as amount_total from table1 发现似乎实 ...

  4. hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询

    紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前 ...

  5. hibernate学习系列-----(3)Session 缓存和持久化生命周期以及Session 基本操作

    Session缓存原理 为了能够在控制台更好的看到我们的hibernate干了些什么,可以在hibernate.cfg.xml文件中写入如下配置: <!-- print all generate ...

  6. hibernate学习系列-----(1)开发环境搭建

    其实一两个月前就在了解hibernate方面的知识了,但一直以来,都没有好好的总结,而且一直使用的是myeclipse,感觉有些傻瓜式的操作就可以搭建起hibernate的开发环境,但这样一点都不好, ...

  7. Django模型层之字段查询参数及聚合函数

    该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 字段查询是指如何指定SQL WHERE子句的 ...

  8. Spark学习之路(十一)—— Spark SQL 聚合函数 Aggregations

    一.简单聚合 1.1 数据准备 // 需要导入spark sql内置的函数包 import org.apache.spark.sql.functions._ val spark = SparkSess ...

  9. ORM之自关联、add、set方法、聚合函数、F、Q查询和事务

    一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...

随机推荐

  1. 在本地文件当中package.json的作用

    除了常见的指定包的相关依赖,一些包的相关信息之外 main: 它是用来指定当前包的入口文件,容易让人忽视的一点是它不仅仅在发布的npm包当中有用,在你的业务代码当中也具有一样的作用. 例如,我需要一个 ...

  2. Restful 权限的思考

      转自:https://cnodejs.org/topic/551802d3687c387d2f5b2906 基于RESTful API 怎么设计用户权限控制? 原文链接:简书 前言 有人说,每个人 ...

  3. python模块导入

    官方手册:https://docs.python.org/3/tutorial/modules.html 可执行文件和模块 python源代码文件按照功能可以分为两种类型: 用于执行的可执行程序文件 ...

  4. 关于SelectedValue的众多解决方案

    Combox联动效果

  5. 我对webform的整改。

    对于webfom,一种写法,将所有业务单元封装在一个pagebase里面,所有的页面继承自pagebase这个service外观,这样的结果就是,所有的页面单元上代码量会非常少.最大程度减少耦合,而最 ...

  6. Winform 模拟Session

    背景 在Web中Session的功能很好用,于是想Winform中实现该功能,典型应用场景则是登陆成功后,当一段时间不操作,则该会话过期,提示重新登陆. 资源下载 测试代码 示例说明:登陆进去10s不 ...

  7. java应用挂死故障排查

    现象: java开发的web应用无法访问 排查: 1.从resin/log/watchdog-manager.log的日志里可以看出来,jvm的内存满,无法创建新进程 java.lang.OutOfM ...

  8. redis集群PHP解决方案

    Redis3.2.4 Cluster集群搭建 服务器环境:192.168.3.229192.168.3.193每台服务器搭建3个节点,组成3个主节点,3个从节点的redis集群. 注意:防火墙一定要开 ...

  9. ubuntu16下安装telnet和opensshserver

    安装了虚拟机,使用的是ubuntu 16,server版本. 启动后发现没有telnet和ssh,就安装了(netstat -a|grep telnet). apt-get install openb ...

  10. Ajax不能跨域访问的解决方案

      文章介绍 这是一篇,引导文吧... 因为写这篇文章时,实在想不出该如何分序.因此以实现跨域访问为目的,从基础知识往上写.最后以百度搜索智能提示为例,来讲解跨域的具体应用! 内容 首先,我们得明确什 ...