黑马程序员技术交流社区

标题: 【郑州校区】Hibernate 入门----Query,Criteria,SQLQuery [打印本页]

作者: 我是楠楠    时间: 2017-12-28 14:15
标题: 【郑州校区】Hibernate 入门----Query,Criteria,SQLQuery
本帖最后由 我是楠楠 于 2017-12-28 14:16 编辑

【郑州校区】Hibernate 入门----Query,Criteria,SQLQuery

hibernate 的Query
HQL(Hibernate Query Language)是一种Hibernate专用的查询语句,基于面向对象的模式,将SQL语句转化成对象的操作格式.
[AppleScript] 纯文本查看 复制代码
@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


[AppleScript] 纯文本查看 复制代码
    String hql = "select id,pwd from user";
        List<Object[]> list = session.createQuery(hql);


[AppleScript] 纯文本查看 复制代码
  String hql = "select count(*) from User";
            Query query = session.createQuery(hql);
            Object uniqueResult = query.uniqueResult();


setFirstResult(N):查询的第N条数据编号
setMaxResults(20):查询的数据总量
[AppleScript] 纯文本查看 复制代码
    String hql = "from User";

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

        System.out.println(list);
[AppleScript] 纯文本查看 复制代码
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");


[AppleScript] 纯文本查看 复制代码
count       返回的结果:Long
max/min     返回的结果:原始类型
sum         返回的结果:Long或Double
avg         返回的结果:Double


由于返回结果通常为单一数据,常使用uniqueResult()获得结果
[AppleScript] 纯文本查看 复制代码
    Query q = s.createQuery("select address,count(address) from UserModel group by address");


[AppleScript] 纯文本查看 复制代码
Query q = s.createQuery("from UserModel order by age desc");


前提: 对象模型中需要有UserModel(age,name)构造方法,参数顺序必须与hql中投影一致.
[AppleScript] 纯文本查看 复制代码
   s.createQuery("select new UserModel(age,name) from UserModel");
———华丽分割——–hibernate 的Criteria
Criteria查询又名QBC查询,以面向对象格式完成查询操作,实现真正的自动生成SQL语句.
[AppleScript] 纯文本查看 复制代码
  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);不能重复复制,如果重复设置的话会把上一个覆盖.
[AppleScript] 纯文本查看 复制代码
 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();


[AppleScript] 纯文本查看 复制代码
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");   


[AppleScript] 纯文本查看 复制代码
  Projections.groupProperty("address");


[AppleScript] 纯文本查看 复制代码
   criteria.addOrder(Order.desc("age"));
        criteria.addOrder(Order.asc("age"));


条件查询使用
[AppleScript] 纯文本查看 复制代码
 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);
将查询字段在view层封装到DetachedCriteria对象中,
DetachedCriteria不依赖session即可创建. 这样session就不会暴露在view以及业务层.最后在Controller层,通过session把DetachedCriteria装换成可以执行查询的Criteria.
[AppleScript] 纯文本查看 复制代码
表现层:
    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查询
[AppleScript] 纯文本查看 复制代码
String sql = "select * from tbl_user";
    SQLQuery sq = session.createSQLQuery(sql);
    sq.list(); //uniqueResult()


[AppleScript] 纯文本查看 复制代码
 String sql = "select u.* from tbl_user u";
    SQLQuery sq = session.createSQLQuery(sql);
    sq.addEntity("别名",模型类.class); // sq.addEntity("u",模型类.class);


———华丽分割——–配置型SQL/HQL语句
[AppleScript] 纯文本查看 复制代码
<!-- hql语句 -->
        <query name=""></query>
        <!-- sql语句 -->
        <sql-query name=""></sql-query>


配置SQL语句时,为避免语句中具有与XML语法格式冲突的符号,通常使用使用XML语法.
[AppleScript] 纯文本查看 复制代码
<sql-query name="这条语句的名字"><![CDATA[from user where age > :age]]></sql-query>  :age 也是占位符


[AppleScript] 纯文本查看 复制代码
   Query q = s.getNamedQuery("配置中的查询名字");



Hibernate入门——HelloWord
【郑州校区】Hibernate入门-----Hiberna核心文件详解
【郑州校区】Hibernate入门----核心API
【郑州校区】Hibernate 入门------简单的CRUD
【郑州校区】Struts2+Hibernate+Spring笔记资源整合
传智播客·黑马程序员郑州校区地址
河南省郑州市 高新区长椿路11号大学科技园(西区)东门8号楼三层
联系电话 0371-56061160/61/62
来校路线  地铁一号线梧桐街站A口出


作者: Bluewonder    时间: 2017-12-28 15:37

作者: 小小的人儿    时间: 2017-12-29 15:08
楼主辛苦了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2