Hibernate 入门----Query,Criteria,SQLQuery

hibernate 的Query
HQL(Hibernate Query Language)是一种Hibernate专用的查询语句,基于面向对象的模式,将SQL语句转化成对象的操作格式.
list() 查询多条

@Test
        public void query(){
            // sql : select 列名    from 表明;
            // hql : select 属性名 from 类名;
            //       select 别名.属性 from 类名 as 别名;
            String hql = "from User";
            Query query = session.createQuery(hql);
            List list = query.list();
            System.out.println(list);
        }

查询多个属性时,返回的是对象数组;
其中对象中第一个为id,第二个元素为pwd

String hql = "select id,pwd from user";
    List<Object[]> list = session.createQuery(hql);

uniqueResult() 查询一条.

String hql = "select count(*) from User";
          Query query = session.createQuery(hql);
          Object uniqueResult = query.uniqueResult();

分页查询
setFirstResult(N):查询的第N条数据编号
setMaxResults(20):查询的数据总量

String hql = "from User";

    Query query = session.createQuery(hql);
    query.setFirstResult(1);
    query.setMaxResults(20);
    List list = query.list();

    System.out.println(list);

可变参数查询(占位符)

String hql = "from User where name = ? and age = ?";
        Query query = session.createQuery(hql);
        query.setParameter(0, "fy"); // query.setString(1, "fy");
        query.setParameter(1, "18");
        List list = query.list();
        System.out.println(list);

        常用写法:
        String hql = "from User where name = :name and age = :age";
        query.setString("name", "fy");
        query.setString("age", "18");

聚合函数

count       返回的结果:Long
max/min     返回的结果:原始类型
sum         返回的结果:Long或Double
avg         返回的结果:Double

由于返回结果通常为单一数据,常使用uniqueResult()获得结果
分组查询

Query q = s.createQuery("select address,count(address) from UserModel group by address");

排序查询

Query q = s.createQuery("from UserModel order by age desc");

投影数据封装
前提: 对象模型中需要有UserModel(age,name)构造方法,参数顺序必须与hql中投影一致.

s.createQuery("select new UserModel(age,name) from UserModel");
———华丽分割——–hibernate 的Criteria
Criteria查询又名QBC查询,以面向对象格式完成查询操作,实现真正的自动生成SQL语句.
查询单一属性: 返回该属性类型

Criteria criteria = session.createCriteria(User.class);
      //Hibernate: select this_.name as y0_ from userdata this_
      方式一:
      Property pro = Property.forName("name");
      criteria.setProjection(pro);
      方式二:
      PropertyProjection property = Projections.property("name");
      criteria.setProjection(property);

      List list = criteria.list();

criteria.setProjection(property);不能重复复制,如果重复设置的话会把上一个覆盖.
查询多个属性: 查询结果为对象数组

1.声明查询属性的列表对象
       ProjectionList li = Projections.projectionList();
       2.声明要查询的属性
       PropertyProjection name = Projections.property("name");
       PropertyProjection id = Projections.property("id");
       3.将查询的属性放入属性列表
       li.add(id);
       li.add(name);
       4.为criteria设置属性列表
       criteria.setProjection(li);
       List<Object[]> list = criteria.list();

聚合函数

count:   行数
            Projection condition = Projections.rowCount();  

        max/min: 最大值
            Projection conditionMax = Projections.max("age");
            Projection conditionMin = Projections.min("age");
        Sum  :   和
            Projection conditionSum = Projections.sum("age");
        Avg :    平均数
            Projection conditionAvg = Projections.avg("age");

分组查询

Projections.groupProperty("address");

排序


criteria.addOrder(Order.desc("age"));
     criteria.addOrder(Order.asc("age"));

条件查询.
条件查询使用

Restrictions.eq 等于= Restrictions.allEq  使用Map,使用key/value进行多个等于的判断
   Restrictions.gt 大于>
   Restrictions.ge 大于等于>=
   Restrictions.lt 小于<
   Restrictions.le 小于等于<=
   Restrictions.between    对应sql的between子句
   Restrictions.like   对应sql的like子句
   Restrictions.in 对应sql的in子句
   Restrictions.and    and 关系
   Restrictions.or or关系
   Restrictions.sqlRestriction Sql限定查询

   Criterion c = Restrictions.allEq(arg0);
   criteria.add(c);

离线查询 (DetachedCriteria)
将查询字段在view层封装到DetachedCriteria对象中,
DetachedCriteria不依赖session即可创建. 这样session就不会暴露在view以及业务层.最后在Controller层,通过session把DetachedCriteria装换成可以执行查询的Criteria.

表现层:
    DetachedCriteria dc = DetachedCriteria.forClass(UserModel.class);
    dc.add(Restrictions.like("address", "%"+address+"%"));
    dc.add(Restrictions.between("age", age1, age2));
    数据层:
    Criteria c = dc.getExecutableCriteria(session);
    c.list();

———华丽分割——–hibernate 的SQLQuery查询
直接执行原生的sql语句.

String sql = "select * from tbl_user";
    SQLQuery sq = session.createSQLQuery(sql);
    sq.list(); //uniqueResult()

通过别名为查询的模型数据进行封装.

String sql = "select u.* from tbl_user u";
   SQLQuery sq = session.createSQLQuery(sql);
   sq.addEntity("别名",模型类.class); // sq.addEntity("u",模型类.class);

———华丽分割——–配置型SQL/HQL语句
1.在hbm.xml的hibernate-mapping元素中配置

配置SQL语句时,为避免语句中具有与XML语法格式冲突的符号,通常使用使用XML语法.
` :age]]> :age 也是占位符`
1.使用Query执行查询
`Query q = s.getNamedQuery("配置中的查询名字");`

原文地址:http://blog.51cto.com/13587708/2117841

时间: 2024-11-04 14:07:36

Hibernate 入门----Query,Criteria,SQLQuery的相关文章

走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

微信公众号[黄小斜]大厂程序员,互联网行业新知,终身学习践行者.关注后回复「Java」.「Python」.「C++」.「大数据」.「机器学习」.「算法」.「AI」.「Android」.「前端」.「iOS」.「考研」.「BAT」.「校招」.「笔试」.「面试」.「面经」.「计算机基础」.「LeetCode」 等关键字可以获取对应的免费学习资料. ? Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hiber

hibernate使用Query进行查询

本文主要探讨hibernate的简单查询,主要是使用Query进行的查询. 1.首先看下annotation的API中关于查询的描述 2.3. 映射查询 2.3.1. 映射EJBQL/HQL查询 使用注解还可以映射EJBQL/HQL查询. @NamedQuery 和@NamedQueries是可使用在类和包上的注解. 但是它们的定义在session factory/entity manager factory范围中是都可见的. 命名式查询通过它的名字和实际的查询字符串来定义. javax.per

hibernate入门知识

课程内容 1        HelloWorld a)   Xml b)   annotation 2        Hibernate原理模拟 - 什么是O/R Mapping以及为什么要有O/R Mapping 3        常见的0/R框架(了解) 4        hibernate基础配置(重点) 5        ID生成策略(重点 AUTO) 6        Hibernate核心开发接口介绍(重点) 7        对象的三种状态(了解) 8        关系映射(重点

史上最简单的Hibernate入门简单介绍

事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate的东西,比方: Tomcat, Eclipse, Log4J,Struts, XDoclet, 甚至JBoss.这easy让人产生Hibernate复杂难懂的误解,特别是打击了刚開始学习的人的积极性. 在这篇文章将不涉及Eclipse, log4j, Struts, Tomcat, XDoclet,

Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装

Hibernate入门第二课 Hibernate Tools for Eclipse Plugins安装 你们可以直接去,http://blog.csdn.net/wei_chong_chong/article/details/52979683,楼主写的挺好的. 自己心得: Hibernate装了好久都装不上去,不是安装过程出了问题,原来是下载的那些软件根本就不对,虽然都有hibertane的英文,但是具体名称要看懂啊,最好做到和视频里面一模一样.

hibernate条件查询 Criteria查询

criteria查询 的方法详解 1.获取 criteria对象 Criteria criteria = this.getSession().createCriteria(Record.class); 红色部分为实体类,此处的Record代表信息记录类 2.追加条件 criteria = criteria.add(Expression.eq("level", 1)); 红色部分 Expression.eq("",""),两个参数第一个是 实体类中

Hibernate入门教程

上一章我们学了一下Hibernate的配置和单张表的操作,这一章说一下Hibernate中一对一的配置 Hibernate入门教程 第二章 Hibernate的一对一单边双边配置.以及增删改查 预备知识: 1.fetch ,可以设置fetch = "select" 和 fetch = "join" fetch ="select"是在查询的时候先查询出一端的实体,然后在根据一端的查询出多端的实体,会产生1+n条sql语句; fetch = &quo

【转】Hibernate入门实例

1. 环境配置 1.1 hiberante环境配置 hibernate可实现面向对象的数据存储.hibernate的官网:http://hibernate.org/ 官网上选择hibernate ORM,可以下载最新的hibernate,还有配套的document教程 http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/ .下载到的hibernate文件夹中有document文档(hibernate\documenta

Hibernate入门篇——第一个Hibernate应用

Hibernate入门 第一步: 挑选jar包 在工程下新建lib文件夹,然后将Hibernate基本包复制进去.可以采用Maven来获取这些包: <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>4.2.7.Final</version> </dependency> 也可