一: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,再决定这个标准放到哪个实体中 // 好处:可以实现复用

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

QBE(Query By Example)

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

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

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

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

  

 @Test
public void testQBE() {
Session session = sf.openSession();
session.beginTransaction();
//和 QBC 相比,QBE 就是多了这个 Example,比QBC多了一重条件
Topic tExample = new Topic();
//'_'代表任意字符
tExample.setTitle("T_"); Example e = Example.create(tExample)
.ignoreCase().enableLike();
Criteria c = session.createCriteria(Topic.class)
.add(Restrictions.gt("id", 2))
.add(Restrictions.lt("id", 8))
.add(e)
; for(Object o : c.list()) {
Topic t = (Topic)o;
System.out.println(t.getId() + "-" + t.getTitle());
}
session.getTransaction().commit();
session.close(); }

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

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

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

 private Category category;
@ManyToOne(fetch=FetchType.LAZY)
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}

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

最新文章

  1. 转载文章——从HelloWorld学习操作系统
  2. 脑成像数据分析:Python工具包
  3. 多节点ListView的加载效率
  4. CEF3开发者系列之JS与C++交互之一
  5. Ubuntu 12.04 DNS服务器的配置方法
  6. Java字符串转换
  7. 浅议iOS网络数据解析
  8. [转]CharacterController与Rigidbody
  9. 升级到iis7 的web.config配置
  10. android在Canvas使用drawBitmap画一幅画
  11. HDU 1501 Zipper(DP,DFS)
  12. 一键下载你的youtube视频
  13. 【JavaScript 实现倒计时(天、时、分、秒)】
  14. ubuntu终端执行shell脚本报command not found解决方法
  15. 第58章 Profile Service - Identity Server 4 中文文档(v1.0.0)
  16. AQS解析(未完成)
  17. 学习笔记之C / C++
  18. SVN previous operation has not finished
  19. AndroidStudio 3.0升级之compile、implementation简要说明
  20. 易普优APS 5.0高级计划排程系统助力工业4.0智能工厂建设

热门文章

  1. Android下文件访问的权限
  2. Kettle源码学习(一)——把Kettle项目跑起来
  3. vue3.x版本安装vue-cli建项目
  4. ToolBar跟随键盘弹出和隐藏
  5. elk报错解决
  6. MySQL知识点系统总结
  7. v-model语法糖在组件中的使用
  8. lamp的动静分离部署
  9. PHP学习(5)——字符串操作与POSIX正则
  10. java面试指导2019-9-16