Hibernate数据查询HibernateQueryLanguage(HQL)CriteriaQueryNativeSQL下面对其分别进行解释HibernateQueryLanguage:HQL提供了是十分强大的功能,它是针对持久化对象,用取得对象,而不进行update,delete和insert等操作。而且HQL是面向对象的,具备继承,多态和关联等特性。from子句:from子句是最简单的HQL,例如fromStudent,也可以写成selectsfromStudents。它简单的返回Student类的所有实例。值得注意的是除了JAVA类和属性的名称外,HQL语句对大小写不敏感。select子句:有时并不需要取得对象的所有属性,这时可以使用select子句进行属性查询,如selects.namefromStudents。例:publicvoidHQLselectDEMO(){TRegisteruser=newTRegister();Sessionsession=HibernateUtil.currentSession();Queryquery=session.createQuery(selectu.userNamefromTRegisteru);Listlist=query.list();for(inti=0;ilist.size();i++){Stringname=(String)list.get(i);System.out.println(name);}}如果要查询两个以上的属性桧以数组的方式返回,如下:publicvoidHQLselectDEMO(){TRegisteruser=newTRegister();Sessionsession=HibernateUtil.currentSession();Queryquery=session.createQuery(selectu.userName,u.sexfromTRegisteru);Listlist=query.list();for(inti=0;ilist.size();i++){Objectobj[]=(Object[])list.get(i);System.out.println(obj[0]+的性别是:+obj[1]);}}在使用属性查询时,由于使用对象数组,操作和理解不太方便,如果将一个object[]中所有成员封装成一个对象就方便多了。下面的程序做了示例:publicvoidHQLselectDEMO(){Sessionsession=HibernateUtil.currentSession();Queryquery=session.createQuery(selectnewTRegister(u.userName,u.sex)fromTRegisteru);Listlist=query.list();for(inti=0;ilist.size();i++){//Objectobj[]=(Object[])list.get(i);TRegisteruser=(TRegister)list.get(i);System.out.println(user.getUserName()+的性别是:+user.getSex());}/**要正确运行以上程序,需要在TRegister类中加入一个相应的构造函数publicTRegister(StringuserName,Stringsex){this.userName=userName;this.sex=sex;}*/}统计函数查询可以在HQL中使用函数,经常使用的函数如下:count():统计记录条数。min():求最小值。max():求最大值。sum():求和。avg():求平均值。例如,要取得Student实例的数量,可以编写如下HQL语句:selectcount(*)fromStudent取得Student平均年龄的HQL语句:selectavg(s.age)fromStudentass可以使用distinct去除重复的数据:selectdistincts.agefromStudentasswhere子句:HQL也支持子查询,它通过where子句实现这一机制。where子句可以让用户缩小要返回的实例的列表范围。例如下面语句会返回所有名字为Bill的Student实例:Queryquery=session.createQuery(fromStudentasswheres.name='Bill');where子句允许出现的表达式包括了SQL中可以使用的大多数情况。数学操作:+,-,*,/真假比较操作:=,=,=,,!=,like逻辑操作:and,or,not字符串连接:||SQL标题函数:如upper()和lower()如果查询返回多条记录,可以用以下关键字来量化all:表示所有的记录。any:表示所有记录中的任意一条。some:与any相同。in:与any等价。exists:表示子查询至少要返回一条记录。例如,下面语句返回所有学生年龄都大于18的班级对象fromGroupgwhere18all(selects.agefromg.studentss)下列语句返回在所有学生中有一个学生的年龄等于22的班级:fromGroupgwhere22=any(selects.agefromg.studentss)或者fromGroupgwhere22=some(selects.agefromg.studentss)或者fromGroupgwhere22in(selects.agefromg.studentss)orderby子句查询返回列表可以按照任何返回的类或者组件的属性排序fromStudentsorderbys.nameasc连接查询与SQL一样,HQL也支持连接查询,如内连接,外连接和交叉连接:innerjoin:内连接leftouterjoin:左外连接rigthouterjoin:右外连接fulljoin:全连接,但不常用下面我重点介绍下内连接查询,左外连接和或外连接和内连接大同小异,而全连接几乎没有使用得到的地方。innerjoin可以简写为join,例如在查询得到的Group对象时,内连接取得对应的Student对象,实现的程序代码如下:Studentstu=null;Groupgroup=null;Queryquery=session.createQuery(fromGroupgjoing.students);Listlist=query.list();Objectobj[]=null;for(inti=0;ilist.size();i++){obj=(Object[])list.get(i);group=(Group)obj[0];//group是数组是第一个对象stu=(Student)obj[1];//stu是数组的第二个对象System.out.println(stu.getName()+属于+group.getName());}CriteriaQuery方式当查询数据时,往往需要设置查询条件。在SQL或HQL语句中,查询条件常常放在where子句中。此处Hibernate还支持Criteria查询,这种查询方式把查询条件封装为一个Criteria对象。在实际应用中,可以使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add方法加入到Criteria实例中。这样程序员可以在不使用SQL甚至HQL的情况下进行数据查询。如下:publicvoidcriteriaDEMO(){Sessionsession=HibernateUtil.currentSession();Criteriacriteria=session.createCriteria(TRegister.class);//生成一个Criteria实例criteria.add(Restrictions.eq(userName,fengyan));//等价于wherename='fengyan'Listlist=criteria.list();TRegisteruser=(TRegister)list.get(0);System.out.println(user.getUserName());}常用的查询限制方法上面代码中Restrictions.eq()方法表示equal,即等于的情况。Restrictions类提供了查询限制机制。它提供了许多方法,以实现查询限制Restrictions.eq():equal,=Restrictions.allEq():参数为Map对象,使用key/value进行多个等于的对比,相当于多个Restrictions.eq()的效果Restrictions.gt():greater-than,Restrictions.lt():less-than,Restrictions.le:less-equal,=Restrictions.between():对应SQL的between子句。Restrictions.like():对应SQL的like子句。Restrictions.in():对应SQL的in子句。Restrictions.and():and关系。Restrictions.or():or关系。Restrictions.isNull():判断属性是否为空,为空返回true,否则返回false。Restrictions.isNoyNull():与上面的相反。Order.asc():根据传入的字段进行升序排序。Order.desc():与上相反MatchMode.EXACT:字符串中精确匹配,相当于like'value'MatchMode.ANYWHERE:字符串在中间位置,相当于like'%value%'MatchMode.START:字符串在最前面,相当于like'value%'MatchMode.END:字符串在最后,相当于like'%value'下面是几个查询限制的例子:查询学生名字以t开关的所有Student对象Criteriacriertia=session.createCriteria(Student.class);criteria.add(Restrictions.like(name,t%));Listlist=criteria.list();Studentstu=(Student)list.get(0);或者:Criteriacriertia=session.createCriteria(Student.class);criteria.add(Restrictions.like(name,t,MatchMode.START));Listlist=criteria.list();Studentstu=(Student)list.get(0);查询学生姓名在Bill,Jack和Tom之间所有的Student对象String[]names={Bill,Jack,Tom};Criteriacriertia=session.createCriteria(Student.class);criteria.add(Restrictions.in(name,names));Listlist=criteria.list();Studentstu=(Student)list.get(0);查询学生年龄(age)等于22或为空(null)的所有学生对象Criteriacriertia=session.createCriteria(Student.class);criteria.add(Restrictions.eq(age,newInteger(22)));criteria.add(Restrictions.isNull(age));Listlist=criteria.list(