HQL使用技术

2019-03-27  本文已影响0人  溺于眼里星河

编写HQL语句

1.from字句

from cn.hibernatedemo.entity.Dept——说明cn.hibernatedemo.entity.Dept是全限定类名
from Dept——说明类名Dept省略了包名
from Dept as dept—from Dept dept
说明:这两条HQL语句为持久化类Dept指派了别名dept,可以在HQL语句中使用这个别名。关键字as是可选的。
<

2.select子句——select子句用于选取对象和属性

select dept.deptName frrom Dept as dep
说明:select字句选取了一个属性deptName,也可以选取多个属性
select dept from Dept as dept——select后跟的是别名dept

3.where字句——where子句用于表达查询的限制条件
4.使用表达式——表达式一般用在where子句中

from Dept dapt where lower(dept.deptName) = 'sales'
说明:这条HQL语句用于查询名称是sales的部门,不区分大小写。lower()函数用于把字符串中的每个字母改为小写。
from Emp where year(hireDate) = 1980
说明:这条HQL用于查询1980年入职的员工。year函数用于获取日期字段的年份

5.order by子句

from Emp order by hireDate asc
说名:这条HQL语句用于查询所有员工,并按员工入职时间升序排序。关键字asc或desc是可选的,用于指明按照升序或降序进行排序,默认升序排列。
from Emp order by hireDate, sa,lary desc
说明:这条HQL语句用于查询所有员工,先按员工入职时间升序,然后时间相同的再按员工工资排序
<

执行HQL语句

        Session session = HibernateUtil.openSession();
        //String hql = "from Users";
        String hql = "from Users where name = 'asdas'";
        Query query = session.createQuery(hql);
        List<Users> list = query.list();
        for (Users u:list){
            System.out.println(u);
        }
        session.close();
    }

动态查询

//示例一
public static void main(String[] args) {

        Session session = HibernateUtil.openSession();
//绑定参数  命名参数以":"开头
        String hql = "from House where title = :title and floorage > :floorage";
        Query query = session.createQuery(hql);

//      Map
//       Map<String,Object> datas = new HashMap<String, Object>();
//        datas.put("title","中关村");
//        query.setProperties(datas);

//        Object

        House house = new House();
        house.setTitle("中关村");
        house.setFloorage(80);
        query.setProperties(house);

        List<House> list = query.list();
        for (House h : list) {
            System.out.println(h);
        }
    }

//示例二
 public static void main(String[] args) {
        House house = new House();
        house.setPrice(2000);
        house.setContact("李阳");
        querySelect(house);
    }

    public static void querySelect(House house) {
        Session session = HibernateUtil.openSession();
        String hql = "from House where 1=1 ";


        if (house != null) {
            if (0 != house.getPrice() && !"".equals(house.getPrice())) {
                hql += " and price > :price ";
            }
            if (null != house.getContact() && !"".equals(house.getContact())) {
                hql += " and contact = :contact ";
            }
        }
        Query query = session.createQuery(hql);
        query.setProperties(house);

        List<House> list = query.list();
        for (House h: list      ){
            System.out.println(h);
        }

    }

绑定各种类型的参数

1.Query接口提供的绑定不同数据类型参数的方法
setBoolean():绑定类型为java.lang.Boolean的参数
setByte():绑定类型为java.lang.Byte的参数
setDouble():绑定类型java.lang.Double的参数
setDate():绑定类型为java.util.Date的参数
setString():绑定类型为java.lang.Strikng的参数
以上,每个方法都有两种重载形式,如setString()方法;
(1).setString(int position, String val):按位置绑定参数
(2).setString(String position, String val):按名称绑定参数
2.setProperties()方法:绑定命名参数与一个对象的属性值
3.使用uniqueResult()方法获取唯一结果
<

分页和投影

 public static void main(String[] args) {

        queryPage(1,3);
    }

    public static void queryPage(int pageNo,int pageSize){
        Session session = HibernateUtil.openSession();
        String hql = " select new Users(name,telephone) from Users ";
        Query query = session.createQuery(hql);
        query.setFirstResult( (pageNo-1)*pageSize);
        query.setMaxResults(pageSize);

        List<Users> list = query.list();
        for (Users u:list   ){
            System.out.println(u.getName()+"|"+u.getTelephone());
        }
    }

query.setFirstResult(0)——用于设置需要返回的第一条记录位置(下标从0开始)
query.setMaxResults(5)——用于设置最大返回记录条数

投影查询

String hql = " select name from Users "
说明:每条查询结果仅包含一个结果列
String hql = " select new Users(name,telephone) from Users "
说明:每条查询结果仅包含不止一个结果列

上一篇 下一篇

猜你喜欢

热点阅读