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,再决定这个标准放到哪个实体中 // 好处:可以实现复用
@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 来进行查询
最新文章
- 转载文章——从HelloWorld学习操作系统
- 脑成像数据分析:Python工具包
- 多节点ListView的加载效率
- CEF3开发者系列之JS与C++交互之一
- Ubuntu 12.04 DNS服务器的配置方法
- Java字符串转换
- 浅议iOS网络数据解析
- [转]CharacterController与Rigidbody
- 升级到iis7 的web.config配置
- android在Canvas使用drawBitmap画一幅画
- HDU 1501 Zipper(DP,DFS)
- 一键下载你的youtube视频
- 【JavaScript 实现倒计时(天、时、分、秒)】
- ubuntu终端执行shell脚本报command not found解决方法
- 第58章 Profile Service - Identity Server 4 中文文档(v1.0.0)
- AQS解析(未完成)
- 学习笔记之C / C++
- SVN previous operation has not finished
- AndroidStudio 3.0升级之compile、implementation简要说明
- 易普优APS 5.0高级计划排程系统助力工业4.0智能工厂建设