HQL实用技术

 

是一种hibernate查询语言,是hibernate识别的数据库查询语言。

是一种面向对象的查询语言,没有表,字段的概念只用对象属性的概念。

因为hibernate存在方言hibernate按照方言的指定将HQL查询转化成所对应的不同的数据库环境语言

使用HQL进行查询避免JDBC的复杂步骤,只需要四部

1、  得到session

2、编写HQL语句

3、 创建Query对象

4、执行查询,得到结果,结果是一个list

例:

    public static void main(String[] args) {

        // 编写查询语句

        // --Street是实体类的类名,而不是数据库里面的名字,区分大小写

        // String sql="select *  from Street as street ";

        // String sql = "from Street ";// 等价于上sql

        // --h.titletitleHouse对象的属性而非数据库中title字段

        String hql = "from House as h where h.title like '%' and h.floorage between 1 and 50000";

        // 打开一个session

        Session session = HibernateSessionFactory.getSession();

        // 创建query

        Query query = session.createQuery(hql);

        // 执行查询--返回一个封装好的list,它根据ORM映射查询后找到对应的实体进行了封装

        List<House> streetList = query.list();

        session.close();

        for (int i = 0; i < streetList.size(); i++) {

            System.out.println(streetList.get(i).getTitle()

                    +"~~"+ streetList.get(i).getFloorage());

        }

   }

Where子句:

String hql = "from House as h where h.title like '%x%' and h.floorage between 1 and 50000";

(部分)属性查询:

   1public List<Users> findByName(String name) {

        // String hql =

        // "select u.id,u.telephone from Users as u where u.name like '%"

        // + name + "%'";

        String hql = "select new Users(u.id,u.telephone) from Users as u where u.name like '%"//封装成对象,实体中必须有和此封装对应的构造函数

                + name + "%'";

        Session session = super.getSession();

        Query query = session.createQuery(hql);

        List<Users> list = query.list();

        session.close();

        return list;

    }

 

    public static void main(String[] args) {

        List<Users> list = new UsersDaoImpl().findByName("a");

        for (int i = 0; i < list.size(); i++) {

            Users items = list.get(i);

            System.out.println(items.getId() + "   " + items.getTelephone());

        }

   }

 

参数绑定:

  name命名参数,根据此参数名进行参数设定

 

2

public List<House> findByTitleAndFloorage(String title, int floorage) {

       String hql = "from House as h where h.title like :title and h.floorage=:floorage";

       Session session = super.getSession();

       Query query = session.createQuery(hql);

       query.setString("title", "%"+title+"%");

       query.setInteger("floorage", floorage);

       List<House> houseList = query.list();

       session.close();

       return houseList;

   }

 

HQL常用聚合函数

Count()

public long computeHouseCount(int userId){

        String hql="select  count(h.id) from House as h where h.userId=?";

        Session session=super.getSession();

        Query query=session.createQuery(hql);

        query.setInteger(0, userId);

        List list=  query.list();

        //int ret=(Integer)list.get(0);

        long ret=(Long)query.uniqueResult();//得到一个值

        session.close();

        return ret;

   }

Max() min()

select max(h.price),min(h.price) from House as h

select h from House as h where datepart(yyyy,h.pubdate)=?

Avg() sum()

分组

 

分页

Query实现简单的分页

 setFirstResultint fr),记录第一条记录的位置(pageIndex-1*pageSize

setMaxResultint mr)设置最大返回记录数 pageSize

例:

/**

     * 分页查询

     */

    public List<House> findAll(int pageNo, int pageSize) {

       String hql="from House as h order by h.pubdate desc";

       Session session=super.getSession();

        Query query=session.createQuery(hql);

        query.setMaxResults(pageSize);

        query.setFirstResult((pageNo-1)*pageSize);

        List<House> houseList=query.list();

        return houseList;

   }

你可能感兴趣的:(HQL,Hibernate)