一 分组查询
HQL查询语句使用groupby子句进行分组查询,使用having子句筛选分组结果。下面通过示例说明。
案例1. 按性别分组,查询学生的平均年龄
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class GroupTest1 {
public static void main(String[] args) {
Session session=null;
String hqlStr="select gender,avg(age) from StudentEntity group by gender";
try {
session=HiberUtil.getSession();
Query qy=session.createQuery(hqlStr);
List<Object[]> stuList=qy.list();
Object[] theRow=null;
for(int i=0;i<stuList.size();i++){
theRow=stuList.get(i);
System.out.println(theRow[0]+"\t"+theRow[1]);
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
案例二. 按照系名分组,查询每个系的学生的最高年龄,最低年龄,平均年龄,并且平均年龄要大于20岁
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class GroupJoinTest2 {
public static void main(String[] args) {
Session session=null;
String hqlStr="SELECT d.departName,MAX(s.age),MIN(s.age),AVG(s.age) "
+" FROM StudentEntity s INNER JOIN s.dept d"
+" GROUP BY d.departName"
+" having avg(s.age)>20";
try {
session=HiberUtil.getSession();
Query qy=session.createQuery(hqlStr);
List<Object[]> stuList=qy.list();
Object[] theRow=null;
for(int i=0;i<stuList.size();i++){
theRow=stuList.get(i);
System.out.println(theRow[0]+"\t"+theRow[1]+"\t"+theRow[2]+"\t"+theRow[3]);
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
二 子查询
案例1 查年龄高于平均年龄的学生
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class ChildQuery1 {
public static void main(String[] args) {
Session session=null;
//查年龄高于平均年龄的学生
String hqlStr="from StudentEntity s where s.age>(select avg(age) from StudentEntity)";
try {
session=HiberUtil.getSession();
Query qy=session.createQuery(hqlStr);
List<StudentEntity> stuList=qy.list();
StudentEntity stu=null;
for(int i=0;i<stuList.size();i++){
stu=stuList.get(i);
System.out.println(stu.getStuName()+"\t"+stu.getAge()+"\t"+stu.getGender());
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
案例2 所有学生年龄都大于21的系
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class ChildQuery2 {
public static void main(String[] args) {
Session session=null;
//所有学生年龄都大于21的系
String hqlStr="from DeptEntity d where 21<all(select s.age from d.stuList s) and d.stuList.size>0";
try {
session=HiberUtil.getSession();
Query qy=session.createQuery(hqlStr);
List<DeptEntity> deptList=qy.list();
DeptEntity stu=null;
for(int i=0;i<deptList.size();i++){
stu=deptList.get(i);
System.out.println(stu.getDepartName()+"\t"+stu.getAddress());
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
案例3 查学生的个数要大于3的系
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class ChildQuery3 {
public static void main(String[] args) {
Session session=null;
//查学生的个数要大于3的系
String hqlStr="from DeptEntity d where d.stuList.size>3";
try {
session=HiberUtil.getSession();
Query qy=session.createQuery(hqlStr);
List<DeptEntity> deptList=qy.list();
DeptEntity stu=null;
for(int i=0;i<deptList.size();i++){
stu=deptList.get(i);
System.out.println(stu.getDepartName()+"\t"+stu.getAddress());
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
三 原生sql查询
使用HQL查询时,Hibernate会生成标准的SQL查询语句,适用于所有的数据库平台,因此HQL是跨数据库平台的。在实际开发中,有时很可能需要使用底层数据库的SQL特性,来生成一些特殊的查询语句。Hibernate提供了原生SQL的查询方式来支持这一需要。
案例1
package com.obtk.test;
import java.text.SimpleDateFormat;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class SrcQueryTest1 {
public static void main(String[] args) {
Session session=null;
String srcSql="select sysdate()";
try {
session=HiberUtil.getSession();
Query qy=session.createSQLQuery(srcSql);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr=sdf.format(qy.uniqueResult());
System.out.println(dateStr);
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
案例2
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class SrcQueryTest2 {
public static void main(String[] args) {
Session session=null;
String hqlStr="SELECT table_name,create_time FROM information_schema.tables"
+" WHERE table_schema='studentdb'";
try {
session=HiberUtil.getSession();
Query qy=session.createSQLQuery(hqlStr);
List<Object[]> stuList=qy.list();
Object[] theRow=null;
for(int i=0;i<stuList.size();i++){
theRow=stuList.get(i);
System.out.println(theRow[0]+"\t"+theRow[1]);
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
Hibernate支持在映射文件中定义字符串形式的查询语句,这样的查询语句称为命名查询语句。
===========================映射文件==============================
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.obtk.entitys">
<class name="StudentEntity" table="student">
<cache usage="read-write" region="stu"/>
<id name="stuId" type="java.lang.Integer">
<column name="stuId" />
<generator class="native"></generator>
</id>
<property name="stuName" type="java.lang.String">
<column name="stuName" length="20" />
</property>
<property name="gender" type="java.lang.String">
<column name="gender" length="2" />
</property>
<property name="age" type="integer">
<column name="age" />
</property>
<property name="address" type="java.lang.String">
<column name="address" length="200" />
</property>
<many-to-one name="dept" class="DeptEntity"
column="deptIdd" lazy="proxy"></many-to-one>
</class>
<!-- 命名查询 -->
<query name="getDept1">
<![CDATA[
from DeptEntity d where d.stuList.size>?
]]>
</query>
<!-- 原生sql命名查询 -->
<sql-query name="srcNameQuery">
SELECT table_name,create_time FROM information_schema.tables
WHERE table_schema='studentdb'
</sql-query>
</hibernate-mapping>
案例1. 命名查询
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class NamingQuery1 {
public static void main(String[] args) {
Session session=null;
//查学生的个数要大于3的系
try {
session=HiberUtil.getSession();
Query qy=session.getNamedQuery("getDept1");
qy.setParameter(0, 3);
List<DeptEntity> deptList=qy.list();
DeptEntity stu=null;
for(int i=0;i<deptList.size();i++){
stu=deptList.get(i);
System.out.println(stu.getDepartName()+"\t"+stu.getAddress());
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}
案例2 原生sql命名查询
package com.obtk.test;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import com.obtk.entitys.DeptEntity;
import com.obtk.entitys.StudentEntity;
import com.obtk.utils.HiberUtil;
public class SrcNameQueryTest2 {
public static void main(String[] args) {
Session session=null;
try {
session=HiberUtil.getSession();
Query qy=session.getNamedQuery("srcNameQuery");
List<Object[]> stuList=qy.list();
Object[] theRow=null;
for(int i=0;i<stuList.size();i++){
theRow=stuList.get(i);
System.out.println(theRow[0]+"\t"+theRow[1]);
}
} catch (HibernateException e) {
e.printStackTrace();
}finally{
HiberUtil.closeSession();
}
}
}