hibernate学习系列—–(5)hibernate基本查询下篇:hibernate聚合函数、分组查询及明明查询 – 余家小子

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


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

图片1

 

在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聚合函数、分组查询及明明查询,转载请注明。



You must enable javascript to see captcha here!

Copyright © All Rights Reserved · Green Hope Theme by Sivan & schiy · Proudly powered by WordPress

无觅相关文章插件,快速提升流量