7.Hibernate查询

 2023-09-13 阅读 21 评论 0

摘要:一:Hibernate可以使用的查询语言   1.NativeSQL:本地语言(数据库自己的SQL语句) hbase 查询,  2.HQL:hibernate自带的查询语句,可以使用HQL语言,转换成具体的方言   3.EJBQL:JPQL 1.0,可以认为是HQL的

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

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

hbase 查询,  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  来进行查询  

转载于:https://www.cnblogs.com/xuzekun/p/7390037.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/54747.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息