Hibernate~HQL语句查询

一:HQL:Hibernate Query Language

    特点:

        1. SQL语句相似,SQL中的语法基本上都可以直接使用

        2. SQL查询的是表和表中的列;HQL查询的是对象与对象中的属性

        3. HQL的关键字不区分大小写,类名和属性名区分大小写

        4. SELECT可以省略

二:HQL查询 :(尽量使用别名)

    (一)简单的查询

        hql="FROM User";(当hbm.xml文件中class标签的auto-import属性(HQL中写类的简单名称时是否自动导入全限定名)设置为false时,'User'要改写为全类名)

    (二)带上过滤条件(可以使用别名,可省略as关键字):where

        hql="FROM User u WHERE u.uid > 10 AND u.uid < 15";  //u.uid可以换成uid,不受别名影响

    (三)带上排序条件:order by

        hql="FROM User u WHERE u.uid > 10 ORDER BY u.username DESC, u.uid ASC";

    (四)指定select子句(不可以使用select *

         hql="SELECT u FROM User u"; 相当于"FROM User"

         hql="SELECT u.username FROM User u";  查询指定列,返回的集合的类型是该属性的类型

         hql="SELECT u.username,u.password FROM User u";   查询多个列,返回的集合的类型是Object数组(数组中的顺序与查询顺序对应)List<Object[ ]>,一般通过Arrays.toString( (Object[ ]) obj )处理之后再打印;针对这种情况,我们可以使用new语法,把查询出来的部分数据封装到对象中

         hql="SELECT new User(u.username,u.password) FROM User u";   User中要有指定参数的带参构造

    (五)执行查询,获得结果(listuniqueResult、分页)

        Query query = session.createQuery("FROM User u");

        query.setFirstResult(0);  相当于limit index,pageSize中的index

        query.setMaxResult(10);  相当于limit index,pageSize中的pageSize

        List list = query.list();  获取列表

        query.uniqueResult();  查询的是唯一的结果(当结果不唯一时,会抛异常)

    (六)方法链

        List list = session.createQuery("FROM User u").setFirstResult(0).setMaxResult(10).list();n

        List list = session.createQuery(//

            "FROM User u")//

            .setFirstResult(0)//

            .setMaxResult(10)//

             .list();

    //----------------------- 进阶 --------------------------------------------------------------------

    (七)聚集函数 min max count avg sum

        hql="SELECT COUNT(*) FROM User u";  count返回Long型数据

    (八)分组 group by ... having ...  select之后一般写的是group by之后的内容或者聚集函数)

        hql="SELECT u.username,COUNT(u.uid)" +

            "FROM User u WHERE u.uid < 9" +

            "GROUP BY u.username" +

            "HAVING COUNT(u.uid) > 2" +

             "ORDER BY COUNT(u.uid) DESC";

        或使用别名:(在having中不能使用列别名,order by中可以使用列别名)

        hql="SELECT u.username,COUNT(u.uid) AS c " +

            "FROM User u WHERE u.uid < 9 " +

            "GROUP BY u.username " +

            "HAVING COUNT(u.uid) > 2 " +

            "ORDER BY c DESC";

    (九)连接查询 / HQL是面向对象的查询

        >>内连接(inner关键字可以省略)

            hql="SELECT u.uid,s.sname FROM User u INNER JOIN u.skill s";  直接把用户名和技能一起查询出来

        >>左外连接(outer关键字可以省略)

             hql="SELECT u.uid,s.sname FROM User u LEFT OUTER JOIN u.skill s";

        >>右外连接(outer关键字可以省略)

            hql="SELECT u.uid,s.sname FROM User u RIGHT OUTER JOIN u.skill s";

        >>超级连接

            hql="SELECT u.uid,u.skill.sname FROM User u";

    (十)查询时使用参数

        >>方式一:使用""占位符(除了JDBC中,所有占位符的索引值都是从0开始)

            hql="FROM User u WHERE u.uid BETWEEN ? AND ?";between...and...包含边界值)

            List list = session.createQuery()

                .setParameter(0,5)  //将第一个占位符的值设置位5

                .setParameter(1,10)  //将第二个占位符的值设置位10

                .list();

        >>方式二:使用变量名(格式: “:变量名”)

            hql="FROM User u WHERE u.uid BETWEEN :uidMin AND :uidMax";

            List list = session.createQuery()

                .setParameter("uidMin",5)  //将第一个变量名的值设置位5

                        .setParameter("uidMax",10)  //将第二个变量名符的值设置位10

                .list();

        当参数是集合时:(只能用变量名的方式结合setParameterList方法

            hql="FROM User u WHERE u.uid IN (:uids)";

            List list = session.createQuery()

                        .setParameterList("uids",new Object[ ] { 1,2,3 })

                        .list();

    (十一)使用命名查询(queryByRange是在hbm.xml文件中定义的查询名)

    blob.png

        List list = session.getNamedQuery("queryByRange")

                    .setParameter("0",5)  //将第一个占位符的值设置位5

                    .setParameter("1",10)  //将第二个占位符的值设置位10

                    .list();

         或:

        List list = session.getNamedQuery("queryByRange")

                    .setParameter("uidMin",5)  //将第一个变量名的值设置位5

                    .setParameter("uidMax",10)  //将第二个变量名的值设置位10

                    .list();

    (十二)updatedelete,不会通知session缓存(所以修改之后不会通知session缓存,只有通过refresh(obj)方法才能更新session中的对象为最新对象)

        updatedelete之后需要refresh(obj)一下来获取最新的状态

            int i = session.createQuery("UPDATE User u SET u.username=? WHERE u.uid>5")

                        .setParameter(0,"newName")

                        .executeUpdate();  //返回int类型的结果,表示影响的行数

            int i = session.createQuery("DELETE User u  WHERE u.uid>5")

                .setParameter(0,"newName")

                .executeUpdate();  //返回int类型的结果,表示影响的行数

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值