zoukankan      html  css  js  c++  java
  • 7.Hibernate查询

    一:Hibernate可以使用的查询语言

      1.NativeSQL:本地语言(数据库自己的SQL语句)

      2.HQL:hibernate自带的查询语句,可以使用HQL语言,转换成具体的方言

      3.EJBQL:JPQL 1.0,可以认为是HQL的一个子集(重点)

      4.QBC:Query By Cretira

      5.QBE:Query By Example

    注意:  1 涵盖 2 涵盖 3 涵盖 4 涵盖 5

       EJBQL 是 HQL的子集,所以直接说是HQL也无可厚非

    HQL:

      举例:1.Query q = session.createQuery("from Topic t where t.category.id = 1");

         2.Query q = session.createQuery("from Msg m where m.topic.category.id = 1");

      注:Topic 和 Msg 大写,用到的是具体的类

    Query by Criteria(QBC):

      QBC(Query by Criteria) 查询方式是Hibernate提供的 "更加面向对象"的一种检索方式,

      QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句

    在Hibernate 应用中使用QBC 查询通常经过三个步骤

      1.使用Session 实例的 createCriteria() 创建Criteria 对象

      2.使用工具类 Restrictions 的相关方法为 Criteria对象设置查询对象

      3.使用 Criteria 对象的list() 方法执行查询,返回查询结果

      注:1.表的连接 .createCriteria("category")  //多表查询

        2.可以使用DetachedCriterea  //先定义Criterea,再决定这个标准放到哪个实体中 // 好处:可以实现复用

     1 @Test
     2     public void testQBC() {
     3         Session session = sf.openSession();
     4         session.beginTransaction();
     5         //criterion 标准/准则/约束
     6         //很多查询条件 被封装成了 一个又一个的函数,等待被add 进 criterion约束 中,(更加面向对象)
     7         Criteria c = session.createCriteria(Topic.class) //from Topic
     8                      
     9                      .add(Restrictions.gt("id", 2)) //greater than    gt("id",2)相当于id > 2
    10                      .add(Restrictions.lt("id", 8)) //little than = id < 8
    11                      .add(Restrictions.like("title", "t_"))
    12                      .createCriteria("category")            //多表查询
    13                      .add(Restrictions.between("id", 3, 5)) //category.id >= 3 and category.id <=5
    14                      ;
    15         //DetachedCriterea    //先定义Criterea,再决定这个标准放到哪个实体中 // 好处:可以实现复用
    16         for(Object o : c.list()) {
    17             Topic t = (Topic)o;
    18             System.out.println(t.getId() + "-" + t.getTitle());
    19         }
    20         session.getTransaction().commit();
    21         session.close();
    22         
    23     }

    QBE(Query By Example)

      //QBE是通过样本对象的属性对查询作出限制了的QBC

      QBE查询就是检索有指定样本对象有相同属性值的对象,因此QBE查询的关键就是样本对象的创建,

      样本对象中的所有非空属性均将作为查询条件。

      QBE查询是QBC查询的功能子集,虽然QBE 没有 QBC 功能大,但是有些场合QBE使用起来更为方便

      

     1 @Test
     2     public void testQBE() {
     3         Session session = sf.openSession();
     4         session.beginTransaction();
     5         //和 QBC 相比,QBE 就是多了这个 Example,比QBC多了一重条件
     6         Topic tExample = new Topic();
     7         //'_'代表任意字符
     8         tExample.setTitle("T_");
     9 
    10         Example e = Example.create(tExample)
    11                     .ignoreCase().enableLike();
    12         Criteria c = session.createCriteria(Topic.class)
    13                      .add(Restrictions.gt("id", 2))
    14                      .add(Restrictions.lt("id", 8))
    15                      .add(e)
    16                      ;
    17                      
    18         
    19         for(Object o : c.list()) {
    20             Topic t = (Topic)o;
    21             System.out.println(t.getId() + "-" + t.getTitle());
    22         }
    23         session.getTransaction().commit();
    24         session.close();
    25         
    26     }

    注:QL 应该和 导航关系结合,共同为查询提供服务

      如:Query q = session.createQuery("from Topic t where t.category.id = 1");

      只有在Topic类中设置了导航,即Topic中要有category属性,并且设置了两者关系

    1 private Category category;
    2     @ManyToOne(fetch=FetchType.LAZY)
    3     public Category getCategory() {
    4         return category;
    5     }
    6     public void setCategory(Category category) {
    7         this.category = category;
    8     }

    才可以使用   t.category.id  来进行查询  

  • 相关阅读:
    Objective-C Memory Management Being Exceptional 异常处理与内存
    Objective-C Memory Management 内存管理 2
    c语言全局变量与局部变量(当变量重名时)的使用情况
    c语言指针字符串与字符数组字符串的区别
    c语言数组不同初始化方式的结果
    补码的用途
    struts2框架加载配置文件的顺序
    CSS盒子模型
    基于注解整合struts2与spring的时候如果不引入struts2-spring-plugin包自动装配无效
    @Resource注解省略name属性后的行为
  • 原文地址:https://www.cnblogs.com/xuzekun/p/7390037.html
Copyright © 2011-2022 走看看