一: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 来进行查询