zoukankan      html  css  js  c++  java
  • Hibernate 查询:HQL查询(Hibernate Query Languge)

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

    使用HQL查询所有学生:

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "from Student";
            Query query = session.createQuery(hql);
            List<Student> students = query.list();
            System.out.println(students);
            
            session.getTransaction().commit();
        }

    字符串 hql 是一条HQl语句,其中Student是指类名而不是表名,该语句查询Student类所映射的表的所有信息。
    使用HQL查询时需要使用到org.hibernate.Query接口,使用Session.createQuery()方法来得到一个Query。
    使用Query.list方法向数据库查询数据,hibernate会自动把数据封装为相应的List集合。你也可以使用query.iterate()来得到一个Iterate。

    查询单个对象(使用 uniqueResult()):

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "from Student where id = 1";
            Query query = session.createQuery(hql);
            Student student = (Student)query.uniqueResult();
            System.out.println(student);
            
            session.getTransaction().commit();
        }

    HQL 语句里可以有where字句,其中where id = 1 查找 id属性为1的学生,注意的是id是Student对象的属性,而不是表的列名!
    确得查询结果只有一条记录事,可以使用Query.uniqueResult()方法。hibernate会自动把数据封闭为相应的对象。

    查询指定的列:

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "select id,name from Student";
            Query query = session.createQuery(hql);
            List<Object[]> s = query.list();
            
            session.getTransaction().commit();
        }

    HQL可以只查询表的其中一列或多列。使用select字句,其中id和name是Student对象的属性名,而不是表的列名!
    只查询指定列返回的是一个List<Object[]>对象。List里的一条记录对应数据库表的一行。Object[]的一个元素即对应表的一个单元格。
    如果使用 uniqueResult() 那返回的就是Object[]对象。

    带命名参数的HQL:

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = " from Student where name like :name";
            Query query = session.createQuery(hql);
            query.setString("name", "张%");
            List<Student> s = query.list();
            
            session.getTransaction().commit();
        }

    在HQL中,使用 : 加命名(如 :name)作为占位符,再使用Query.setString(),query.setInteger()等方法为相应的占位符设置参数(不确定类型可以使用setParameter())。
    上面例子中的HQL语句等同于 "from Student where name like '张%'"

    实例参数查询:

    通过添加一个新类来作为HQL语句查询条件的参数。

    public class BookQuery {
    
        private String name;
        private String author;
        private double maxPrice;
        private double minPrice;
        
        //省略get,set语句.........
    
    }

    查询任意名字,作者姓张,价格在5-20之间的图书:

    public static void main(String[] args) {
            //创建查询条件对象
            BookQuery bq= new BookQuery();
            bq.setName("%");
            bq.setAuthor("张%");
            bq.setMinPrice(5);
            bq.setMaxPrice(20);
            
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "from Book where name like :name "
                    + "and author like :author "
                    + "and price between :minPrice and :maxPrice";
            Query query = session.createQuery(hql);
            //把查询条件对象作为HQL查询的参数
            query.setProperties(bq);
            List<Book> books = query.list();
            
            session.getTransaction().commit();
        }

    BookQuery类的属性名必须和HQL语句的参数名一致,并提供get,set方法。
    通过 setProperties()方法把查询条件对象作为HQL查询的参数。

    连接查询(join 语法):

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "from Student s inner join s.grade g";
            Query query = session.createQuery(hql);
            List<Object[]> s = query.list();
            
            session.getTransaction().commit();
        }

    内连接使用join,左外连接使用left join,右外连接使用reght join。和sql语句基本一致。
    join 后面是 s.grade 而不是直接写 Grade 类名。
    因为表之间的关联关系已经通过映射文件或注解设好,所以在join子句中不需要声明关系。
    上面例子里同时返回学生和班级的所有信息,返回值是一个 List<Object[]><Object[]> 。其中每一个Object[]里,下标0的元素为Student对象,下标1的元素为Grade对象。

    使用聚合函数:

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "Select count(s) from Student s";
            Query query = session.createQuery(hql);
            Object count = query.uniqueResult();
            
            session.getTransaction().commit();
        }

    count()求总数、avg(...), sum(...), min(...), max(...)分别是平均值,总和,最大,最小值。

    Hibernate 分页:

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            String hql = "from Student ";
            Query query = session.createQuery(hql);
            query.setFirstResult(2);
            query.setMaxResults(2);
            List<Student> s = query.list();
            System.out.println(s);
            session.getTransaction().commit();
        }

    setFirstResult:设置开始行,从0开始。
    setMaxResults:设置取的记录数。

    HQL命名查询:

    通过把hql语句写到外部映射文件(*.hbm.xml)来实现HQL和代码分离。

    在学生表的映射文件中加入如下代码:

    <query name="getStudent">
        <![CDATA[from Student where id=:id]]>
    </query>

    <query>标签写在<hibernate-mapping>标签内。
    <![CDATA[   ]]>  写的是一条HQL语句。
    通过<query>标签的name属性为该HQL指定一个名称。

    public static void main(String[] args) {
            Session session = HibernateUtil.getSessionFactory().getCurrentSession();
            session.beginTransaction();
            
            Query query = session.getNamedQuery("getStudent");
            query.setInteger("id", 6);
            Student s = (Student)query.uniqueResult();
            
            session.getTransaction().commit();
        }

    通过session.getNamedQuery()方法得到一个用于命名查询的Query。把HQL语句的名称传进去。

  • 相关阅读:
    Dos命令快速设置ip、网关、dns地址
    远程桌面连接保存登陆用户以及密码(凭据)备份方法
    如何启用windows8, windows10中被停用的远程桌面,如何连接windows10远程桌面?
    通过日志恢复SQL Server的历史数据
    http://sourceforge.net/projects/rtspdirectshow/
    iphone上实现H264 硬编码
    利用lipo编译合并iPhone模拟器和真机通用的静态类
    在iOS上使用ffmpeg播放视频
    基于.Net的单点登录(SSO)解决方案
    java实现简单的单点登录
  • 原文地址:https://www.cnblogs.com/likailan/p/3446488.html
Copyright © 2011-2022 走看看