才高行厚的hibernate(4)---hibernate的HQL语言

来源:互联网 发布:vmware for mac 编辑:程序博客网 时间:2024/05/29 00:30

hql基本:

检索所有对象:from   类

检索类某几个属性:select 类.属性1,类.属性2 form 类

指定别名:select  类.属性1,类.属性2 from 类 as c where c.主属性=1-->即c为此类的别名

过滤重复值:select distinct 类.属性 from 类

删除对象:delete 类 where 类.属性>10

更新对象值:update 类  set  类.属性=‘senssic’ where 类.id=1

更新多个对象值:update 类 set 类.属性=‘senssic’,类.属性2=23 where 类.id=1

查询并计算属性值:select 类.属性,100-类.age from 类

使用函数:select  lower(类.name) from 类

between...and...和not between... and...确定查询范围:

        select 类.属性  from 类 where 类.age between 10 and 30

        select 类.属性  from 类 where 类.age between 10 and 30

in和not in确定查询集合:

        select 类.属性  from 类 where 类.city in ('阜阳','池州')

        select 类.属性  from 类 where 类.city not in ('阜阳','池州')

like进行模糊查询:

         用like进行模糊查询时有两个可用的通配符:“%”“_”“%”代表长度大于等于0的字符,“_”代表长度为1的单个字符。

         select  类.属性  form 类  where 类.name like ‘%祁%’--->参考结果:祁,祁煜,祁大煜

         select  类.属性  form 类  where 类.name like “-祁-”--->参考结果:大祁煜,小祁煜,小祁小(必须为三个字符)

and逻辑与:select  类.属性 from 类 where 类.id>10 and 类.name='池州'

or逻辑或:select  类.属性 from 类 where 类.id>10  or   类.name='池州'

order by 对结果进行排序:

          “order by”关键字对结果进行排序,默认为升序。“order by asc”为升序,“order by desc”为降序。

           from 类 order by 类.age--->也可以写成:from 类 order by 类.age asc  因为默认为升序

           from 类 order by 类.age desc

group by对记录进行分组:

            对查询进行分组可以对查询进行细化。分组经常和聚集函数一起使用,这样聚集函数将作用于每个分组。

            select avg(类.age),类.city  from 类 group by 类.city --->按照城市分组并求得每个城市的平均年龄值

having关键字:

             having关键字和group by关键字搭配使用,它对分组后的记录进行筛选,输出符合having指定条件的组。

            select 类.属性 from 类 group by 类.city having count(*)>10000--->查询人数大于10000人的城市

             where和having的区别在于作用对象不同。where作用于基本表,而having作用于分组后的组。

聚集函数:聚集函数包括count()、avg()、sum()、max()、min()

                count() 计算符合条件的记录条数         select count(*) form 类

                avg()  计算符合条件的平均值            select  avg(类.age) form 类
                sum() 计算符合条件的和                     select sum(类.age) from 类
                max() 计算符合条件的最大值             select max(类.age) from 类
                min() 计算符合条件的最小值             select min(类.age) from 类

                聚集函数经常和group by分组关键字搭配使用

HQL进阶

查询类及其所有继承的类的实例

               默认情况下,当查询一个类时,Hibernate会自动搜索这个类的所有继承类

               from 类--->会查询所有类和类子类的实例

               from  java.lang.Object --->因为都继承至Object所以会查询所有映射表的记录

限制每次查询的返回对象数

                Query接口提供了两个函数,用于限制每次查询返回的对象数。

                setFirstResult(int firstResult) 用于设置从哪一个对象开始检索。参数firstResult设置开始检索的起始记录。

                setMaxResults(int maxResults) 用于设置每次检索返回的最大对象数。参数maxResults用于设置每次检索返回的对象数目。

绑定参数

         String hql="from Student where sname=? and sage>?";    //声明hql语句,命名参数用代替

         Query query=session.createQuery(hql); //创建查询

         query.setParameter(0,"senssic");         //绑定参数

         query.setParameter(1,new Integer(20));

         List list=query.list();     //执行查询

         在HQL语句中用问号“?”代替命名参数。此时setParameter()函数的第一个参数指定参数的位置(position),0HQL查询语句中的第一个参数,1为第二个参数,以此类推。

在映射文件配置HQL语句

        为了使程序具有更大的灵活性,Hibernate可以在映射文件中配置HQL语句。如下所示为在Student.hbm.xml中的配置。

            <hibernate-mapping>

                  <class name="hibernate.senssic" table="student" catalog="joblog">

                   <!--此处省略了配置-->

                   </class>

             <query name="searchStudent">

                    <![CDATA[

                        from Student s where s.sage>22

                             ]]>

              </query>

             </hibernate-mapping>

         可以用如下代码访问配置文件中的HQL语句。

                Session session=Hsf.currentSession();//创建Session

                Query query=session.getNamedQuery("searchStudent"); //getNamedQuery得到查询

                List list=query.list();   //执行查询

                Iterator it=list.iterator();

                while(it.hasNext()){

                       Student stu=(Student)it.next();

                     System.out.println(stu.getSname());

                                    }

          其中,getNamedQuery()函数用来访问映射文件中配置的HQL语句,参数为配置的名称。

HQL的嵌套子查询

         在SQL中,一个select-from-where语句成为一个查询块。将一个查询块嵌套在另一个查询块的where子句或having短语的

         条件中,这样的查询称为嵌套查询或者子查询

         from 类
            where 类.sno in (select sno from 类2 where 类2.age='10')

带有IN谓词的子查询

        带有IN谓词的子查询指的是父查询与子查询用谓词IN连接,判断某个属性列值是否在子查询的结果中

        from  类
           where 类.city in (select 类.city from 类2 where 类2.age=10)

比较子查询

       如果确切知道子查询返回的是单值,可以用=>>=<<=<>比较运算符进行比较子查询。        from 类 where 类.age>100

带有ANYALL的子查询

       使用ANY或者ALL谓词时,必须同时使用比较运算符
       from 类
       where 类.age<ANY(select 类.age from 类2 where 类2.city='池州')
       

        >ANY,大于子查询结果中的某个值。

        <ANY,小于子查询中的某个值。

        >=ANY,大于等于子查询中的某个值。

        <=ANY,小于等于子查询中的某个值。

        =ANY,等于子查询中的某个值。

        !=ANY或者<>ANY,不等于子查询中的某个值。

        >ALL,大于子查询中的所有值。

        <ALL,小于子查询中的所有值。

        >=ALL,大于等于子查询中的所有值。

        <=ALL,小于等于子查询中的所有值。

        =ALL,等于子查询中的所有值。

        !=ALL或者<>ALL,不等于子查询中的任何一个值。

HQL的多表查询

左外连接:左外连接(Left Outer Join)查询出左表对应的复合条件的所有记录

        关键代码:  

        // HQL查询语句

        String hql = "from Student s left join s.course c where s.sname='senssic'";

        Query query = session.createQuery(hql); // 创建查询

        List list = query.list(); // 执行查询

        Iterator it = list.iterator();

        while (it.hasNext()) {

            Object[] obj = (Object[]) it.next();

            Student stu = (Student) obj[0];

            Course course = (Course) obj[1];

            System.out.println("学生信息及其选课信息");

            if (course != null) {

                System.out.println(stu.getSno() + "\t" + stu.getSname() + "\t" + "课程:"

                        + course.getCname());

            } else {

                System.out.println(stu.getSno() + "\t" + stu.getSname() + "\t");

            }

        }

      使用"select s from Student s left join s.course c where s.sname='senssic"只返回student对象

左外抓取连接:左外抓取连接指定在Hibernate检索数据时,采用抓取的方式,直接将数据加载到与Student对象关联的course属性中

         关键代码:        

           // HQL查询语句

           String hql = "select s from Student s left join fetch s.course c where s.sname='senssic'";

           Query query = session.createQuery(hql); // 创建查询

           List list = query.list(); // 执行查询

           Iterator it = list.iterator();

           while (it.hasNext()) {

               Student stu = (Student) it.next();

               System.out.println("学生信息及其选课信息");

               System.out.println(stu.getSno() + "\t" + stu.getSname() + "\t"+stu.getcourse.getCname());

                                }

          与左外连接不同的是:左外抓取连接query.list()返回的集合中存放Student对象的引用,与之相关联的选课信息存放在course属性中。


右外连接
      HQL中使用关键字right outer join右外连接,outer关键字可以省略。右外连接与左外连接类似,不再赘述。


内连接:内连接(Inner Join)是指两个表中指定的关键字相等的值才会出现在结果集中的一种查询方式。HQL中使用关键字inner join进行内连接

        String hql = "from Student s inner join s.course c"// HQL查询语句

        Query query = session.createQuery(hql);// 创建查询

        List list = query.list(); // 执行查询

        Iterator it = list.iterator();

         while (it.hasNext()) {

             Object[] obj = (Object[]) it.next();

             Student stu = (Student) obj[0];

             Course course = (Course) obj[1];

              System.out.println("学生信息及其选课信息");

            System.out.println(stu.getSno() + "\t" + stu.getSname() + "\t" + "课程:"+ course.getCname());

                          }

        }


抓取内连接:抓取内连接与内连接不同之处在于其对象的内存状态不一样。直接将数据加载到与Student对象关联的course属性中

             String hql = "select s from Student s inner join fetch s.course c"// HQL语句

             Query query = session.createQuery(hql);// 创建查询

             List list = query.list(); // 执行查询

             Iterator it = list.iterator();

              while (it.hasNext()) {

                      Student stu = (Student) it.next();

                      System.out.println("学生信息及其选课信息");

                   System.out.println(stu.getSno() + "\t" + stu.getSname() + "\t"+stu.getcourse.getCname());

                                  }

       它与内连接的区别是返回检索的list中存放的是Student对象的引用,与之相关联的选课信息存放在course属性中。


原创粉丝点击