叙:之前介绍过hibernate的HQL(hibernate query language)的查询数据方式,现在我学习记录一下关于hibernate的另一个查询数据的方式–QBC,QBC数据查询全称是(Query By Criteria数据查询),下面是我学习的笔记~
QBC数据查询
1. QBC介绍
QBC(Query By Criteria)查询方式是Hibernate提供的“更加面向对象”的一种检索方式。QBC在条件查询上比HQL查询更为灵活,而且支持运行时动态生成查询语句,因此不需要手动设置查询语句。
QBC查询主要由Criteria接口、Criterion接口和Expression类组成。Criteria接口是Hibernate API中的一个查询接口,它需要有session进行创建。Criterion是Criteria的查询,在Criteria中提供了add(Criterion criterion)方法来添加查询条件。使用QBC检索对象的示例代码如下图所示:
//创建 criteria 对象
Criteria criteria = session.createCriteria(Customer.class);
//设定查询条件
Criterion criterion = Restrictions.eq("id", 1);
//添加查询条件
criteria.add(criterion);
//执行查询,返回查询结果
List<Customer> cs = criteria.list();
上述代码中意思是查询Customer对象所映射的数据表中id为1的数据;
QBC检索是使用的Restrictions对象编写查询条件的,在Restrictions类中提供了大量的静态方法来创建查询条件。其常使用的方法如下表所示:
2 .常见的查询方法
2.1. 基本查询
此查询是QBC的基本查询方式,没有任何修饰,查询所有一张表的所有数据;
@Test
// QBC基本查询
public void demo1() {
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
Criteria cust = session.createCriteria(Customer.class);
List<Customer> list = cust.list();
for (Customer customer : list) {
System.out.println(customer);
}
bt.commit();
session.close();
}
QBC查询不需要查询语句,直接在createCriteria()括号中加入索要查询的表的映射对象名;
2.2. 条件查询
条件查询需要使用到add()方法来进行添加查询条件,调用Restrictions类以及这个类中的方法,具体代码如下:
@Test
// QBC条件查询
public void demo2() {
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
Criteria cust = session.createCriteria(Customer.class);
//Criteria custo = cust.add(Restrictions.idEq(2l));
Criteria custo = cust.add(Restrictions.eq("cust_name","天线宝宝"));
//Criteria custo = cust.add(Restrictions.like("cust_name","%羊%"));//模糊查询
//Criteria custo = cust.add(Restrictions.gt("cust_id",2l));//id大于2的所有数据
List<Customer> list = custo.list();
for (Customer customer : list) {
System.out.println(customer);
}
bt.commit();
session.close();
}
代码中使用的Restrictions对象的ideq()方法,这个方法是id值等于括号内设定的id值,然后运行后程序会自动匹对id列的所有值;
当然,也可以用模糊查询like(),范围查询gt()等;
2.3. 分页查询
QBC的分页查询和HQL的分页查询一样,均是由起始索引方法setFirstResult()和每页最大显示数方法setMaxResult()来设置,具体代码如下:
@Test
// QBC分页查询
public void demo3() {
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
Criteria cust = session.createCriteria(Customer.class);
cust.setFirstResult(2);
cust.setMaxResults(2);
List<Customer> list = cust.list();
for (Customer customer : list) {
System.out.println(customer);
}
bt.commit();
session.close();
}
注意:起始索引值是从0开始的,因此想要打印出以id为n开头的数据时,将索引值设置成n-1方可;
2.4. 排序查询
使用addOrder()方法然后在方法内部调用Order类中的方法,升序或者降序,然后在调用的方法内部设置根据对象的哪个属性进行排序;
@Test
// QBC排序查询
public void demo4() {
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
Criteria cust = session.createCriteria(Customer.class);
cust.addOrder(Order.desc("cust_name"));
List<Customer> list = cust.list();
for (Customer customer : list) {
System.out.println(customer);
}
bt.commit();
session.close();
}
2.5. 统计查询
统计查询使用的方法和之前的就有所不同了,使用的是setProjection()方法,然后再方法中调用Projections类的查询规则(就是统计哪方面的数据),详细代码如下:
@Test
// QBC统计查询
public void demo5() {
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
Criteria cust = session.createCriteria(LinkMan.class);
cust.setProjection(Projections.rowCount());
List<Long> list = cust.list();
System.out.println(list);
bt.commit();
session.close();
}
3. 离线查询
将离线查询的业务流程和传统的criteria的业务流程进行对比:
DetachedCriteria翻译为离线条件查询,因为它是可以脱离Session 来使用的一种条件查询对象,我们都知道Criteria对象必须由Session对象来创建。那么也就是说必须先有Session才可以生成Criteria对象。而 DetachedCriteria对象可以在其他层对条件进行封装。
这个对象也是比较有用的,尤其在 SSH 整合以后这个对象经常会使用。 它的主要优点是做些特别复杂的条件查询的时候,往往会在WEB层向业务层传递很多的参数,业务层又会将这些参数传递给DAO层。 最后在 DAO 中拼接 SQL完成查询。有了离线条件查询对象后,那么这些工作都可以不用关心了, 我们可以在WEB层将数据封装好,传递到业务层,再由业务层传递给DAO完成查询。
具体代码如下所示:
@Test
// QBC离线查询
public void demo1() {
// 模拟web/service层的
// 1.在web层创建获取一个离线查询的对象
DetachedCriteria lkm = DetachedCriteria.forClass(LinkMan.class);
// 2.在此对象中加入要查询的条件(与正常的Criteria查询中的一样)
lkm.add(Restrictions.like("lkm_name","熊%"));
//-----------------------------------------
//-----------------------------------------
// 在dao层中的代码
Session session = HibernateUtils.openSession();
Transaction bt = session.beginTransaction();
// 1.将离线查询对象与session绑定
Criteria linkMan = lkm.getExecutableCriteria(session);
List<LinkMan> list = linkMan.list();
for (LinkMan linkMan2 : list) {
System.out.println(linkMan2.getLkm_name());
}
bt.commit();
}
这个知识点并不难,根据注释记着就行了;
《本章完》
今天的文章qsqlquery查询到的数据个数_q现绑查询工具分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/81641.html