Hibernate的八大类HQL查询集合
Hibernate的八大类HQL查询集合:
一:属性查询(SimplePropertyQuery)
1,单一属性查询
*返回结果集属性列表,元素类型和实体类中相应的属性一致
2,多个属性查询,
*返回集合中的元素是object数组,
*其中数组元素的类型和对应属性在实体类中的类型一致
代码:
for(Iteratoriterator=list.iterator();iterator.hasNext();)
{
Object[]obj=(Object[])iterator.next();
System.out.println("sid:="+obj[0].toString()+"sname:="+obj[1]);
}
3,通过hql来动态实例化对象
代码:
Listlist=session.createQuery("selectnewStudent(sid,sname)fromStudent").list();
for(Iteratoriterator=list.iterator();iterator.hasNext();){
Studentstudent=(Student)iterator.next();
System.out.println("sid:="+student.getSid()+"sname:="+student.getSname());
}
4,采用别名查询
代码:
//Listlist=session.createQuery("selects.sid,s.snamefromStudentass").list();
Listlist=session.createQuery("selects.sid,s.snamefromStudents").list();
二:简单对象查询(SimplyObjectQuery)
1,返回对象集合(可以忽略select)
代码:
//Listlist=session.createQuery("fromStudent").list();
//Listlist=session.createQuery("fromStudentass").list();
Listlist=session.createQuery("fromStudents").list();
2,采用select查询对象
*必须要使用别名
代码:
//Listlist=session.createQuery("selectsfromStudentass").list();
Listlist=session.createQuery("selectsfromStudents").list();
3,查询单一对象的操作
代码:
Objectobj=session.createQuery("selectsfromStudentswheres.sid=:mysid")
.setParameter("mysid",12)
.uniqueResult();
4,分页查询
*setFirstResult(intfirstResult)
*Setthefirstrowtoretrieve.
*Ifnotset,rowswillberetrievedbeginnningfromrow0.
*firstResult-arownumber,numberedfrom0
代码:
Listlist=session.createQuery("selectsfromStudents")
.setFirstResult(5)
.setMaxResults(5)
.list();
三:简单条件查询(SimpleConditionQuery)
1,可以拼凑字符串
代码:
ListstuList=session.createQuery("selects.sid,s.snamefromStudentasswheres.snamelike'%1%'").list();
2,注意:可以采用?占位的方式来传递参数
*参数的索引从0开始
*传递的参数值不能用''号括起来
*注意方法链编程
代码:
/*
*Queryquery=ession.createQuery("selects.sid,s.snamefromStudentasswheres.snamelike?");
*query.setParameter(0,"%1%");
*ListstuList=query.list();
*/
ListstuList=session.createQuery("selects.sid,s.snamefromStudentasswheres.snamelike?")
.setParameter(0,"%1%")
.list();
3,通过参数名(:参数名)传参的方式进行查询
代码:
/*Objectobj=session.createQuery("selects.sid,s.snamefromStudentasswheres.snamelike:mynameands.sid=:myid")
.setParameter("myname","%1%")
.setParameter("myid",98)
.uniqueResult();//.list();
Object[]objs=(Object[])obj;
System.out.println("s.sid:="+objs[0].toString()+"s.sname:="+objs[1].toString());
*/
ListstuList=session.createQuery("selects.sid,s.snamefromStudentasswheres.snamelike:mynameands.sid=:myid")
.setParameter("myname","%1%")
.setParameter("myid",98)
.list();
4,传递多个参数的查询
*支持in查询,需要setParameterList("myids",newObject[]{12,13,14})的方式进行参数传递
代码:
ListstuList=session.createQuery("selects.sid,s.snamefromStudentasswheres.idin(:myids)")
.setParameterList("myids",newObject[]{12,13,14})
.list();
5,查询2009年2月入学的学员信息
*支持Sql函数查询
代码:
ListstuList=session.createQuery("selects.sid,s.sname,s.schoolDatefromStudentasswhereyear(s.schoolDate)=:myyearandmonth(s.schoolDate)=:mymonth")
.setParameter("myyear",2009)
.setParameter("mymonth",2)
.list();
6,查询2009-02-10到2009-02-15号入学的学员信息
*注意:在进行日期查询时
*setParameter("startDate",formatter.parse("2009-02-1000:00:00"))
*方法中第二个参数是一个Object对象(Date类型对象)
代码:
SimpleDateFormatformatter=newSimpleDateFormat("yyyy-MM-ddHH:mm:ss");
ListstuList=session.createQuery("selects.sid,s.sname,s.schoolDatefromStudentasswheres.schoolDatebetween:startDateand:endDate")
.setParameter("startDate",formatter.parse("2009-02-1000:00:00"))
.setParameter("endDate",formatter.parse("2009-02-1523:59:59"))
.list();
四:原生SQL语句查询(SqlQueryTest_4)
*这里用的是createSQLQuery().list();
代码:
ListstuList=session.createSQLQuery("select*fromStudent").list();
五:外置命名查询(NamedQueryTest_5)
*1.在映射文件中采用<query>标签来定义HQL语句,不必限定文件!!!注意:映射文件中的HQL语句不可以出错,否则会导致QuerySyntaxException,特别是要查询的实体类名写错的情况。(Errorinnamedquery:selectAllStudentsorg.hibernate.hql.ast.QuerySyntaxException:Studentsisnotmapped)。
*2.在程序中通过session.getNamedQuery(hql_name)得到查询语句
代码:
Listlist=session.getNamedQuery("selectAllStudents")
.setParameter("mysid",12).list();
六:对象导航查询(ObjectNavQueryTest_6)
代码:
Listlist=session.createQuery("selects.snamefromStudentasswheres.clsInfo.cnamelike:myname")
.setParameter("myname","%1%")
.list();
七:联合查询(JoinQueryTest_7)
1,联合查询*内连接查询
*获取已经参加班级报名的所有学生名号和其所在班级名称
代码:
Listlist=session.createQuery("selects.sname,c.cnamefromStudentassjoins.clsInfoasc").list();
2,联合查询*左连接查询
*获取所有班级名称和其学员姓名
*以班级信息表为主表,进行左外连接查询
代码:
Listlist=session.createQuery("selectc.cname,s.snamefromClassInfoascleftjoinc.studentSetass").list();
3,联合查询*右连接查询
*获取所有学员姓名和其所属班级名称
*以学员信息表为主表,进行右外连接查询
代码:
Listlist=session.createQuery("selects.sname,c.cnamefromClassInfoascrightjoinc.studentSetass").list();
八:(StateQueryTest_8)
1,聚合函数使用
代码:
//Listlist=session.createQuery("selectcount(*)fromStudent").list();
//longcount=(Long)list.get(0);
longcount=(Long)session.createQuery("selectcount(*)fromStudent").uniqueResult();
2,分组查询
代码:
Listlist=session.createQuery("selectc.cname,count(s)fromStudentassinnerjoins.clsInfoascgroupbyc.cnameorderbyc.cname").list();