hibernate---HQL语句

一、HQL原理

  1. 面向对象,与数据库无关
  2. 最终也会生成sql,即HQL使用范围小于sql的范围
  3. 由query对象获得
  4. HQL语句没有insert语句,只能session.save添加

 

二、HQL与Sql区别:

        sql关联查询:

  1. ","号默认内关联---------------查询两表同时存在的数据
  2. left/right join 为左/右外连接----------查询左/右表数据,右/左表没有,以左/右表为准,右/左表为null
  3. join...on...  关联条件

        HQL关联查询

  1. 在hibernate中已经做好了映射关系,可用对象调用对象的方式查询
  2. 对象与对象间一定要配置映射关系(才能关联查询)
  3. 没有join后on加条件

 

         sql语句分页:limit(起始数(当前页),每页显示数(常量))

         HQL语句分页:.setFirstResult((currPage-1)*number)//起始位置 .setMaxResults(number)//每页显示行数

 

三、代码实例:

@Test
    public void findJoin(){//HQL联表查询
        String hql = "select new Map(s.name,t.name,t.clas) from StudentBean s left join s.teacher t where t.name=?";

        List<Map> list = session.createQuery(hql).setParameter(0, "陈老师").list();

        for (Map map:list) {
            System.out.println(map.get("0"));
        }

    }
    
    @Test
    public void findPage(){//演示HQL分页查询
        int currPage = 1;
        int number = 2;

        String hql = "from StudentBean";

        List<StudentBean> list = session.createQuery(hql)
                .setFirstResult((currPage-1)*number)//起始位置
                .setMaxResults(number)//每页显示行数
                .list();

        for (StudentBean stu:list) {
            System.out.println(stu.getName());
        }

    }

    @Test
    public void findObj(){//查询对象
        String hql = "from TeacherBean where name=?";

        TeacherBean t = (TeacherBean) session.createQuery(hql)
                .setParameter(0, "陈老师").uniqueResult();//表示唯一对象

        System.out.println(t.getName());

    }


    @Test
    public void del(){//删除
        String hql = "delete from StudentBean where name=?";

        int i = session.createQuery(hql)
                .setParameter(0, "小子3").executeUpdate();//表示执行修改、删除后返回受影响的行数

        System.out.println(i);

    }

    @Test
    public void update(){//修改
        String hql = "update StudentBean set name = ? where name = ?";

        int i = session.createQuery(hql)
                .setParameter(0, "小子22")
                .setParameter(1, "小子22").executeUpdate();

        System.out.println(i);

    }

=====================================================================================================================================
@Test
public void findTeacher(){//将查询结果放入实体中
    String sql = "select * from t_teacher";
    //查询结果要与对应实体属性一一对应,不能是*(不知道哪个数据放到哪个属性里)
    //实体与数据表列名早已经映射好,不需要取别名

    NativeQuery query = session.createNativeQuery(sql);
    query.addEntity(TeacherBean.class);//把查询结果放到,被hibernate管理的实体中

    List<TeacherBean> list = query.list();
    for (TeacherBean t:list) {
        System.out.println(t.getName());
    }

}

@Test
public void findTeacher2(){//把查询结果放入数组中
    String sql = "select t_name,t_class from t_teacher";

    List<Object[]> list = session.createNativeQuery(sql).list();

    for (Object[] obj:list) {
        System.out.println(obj[0]+";"+obj[1]);
    }

}

 

posted @ 2020-03-20 16:28  天上飞花  阅读(275)  评论(0)    收藏  举报