10.3 hibernate_查询方式(QBC查询、本地SQL查询)
QBC检索
- QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口
HQL所能做的事情,使用QBC也大多能做用,这个通过实例来看看QBC是如何使用的。
步骤:
- 获得session
- 创建criteria对象:session.createCriteria(Obejct.class);
- 添加查询条件:使用criteria的API方法进行条件的增加。add(Restrictions.eq(属性名,值))
- 执行查询
list():返回一个集合列表,有可能集合中装的是数组,有可能是POJO对象。
uniqueResult():返回一个查询结果,在已知查询结果只有一个或者0个时,使用是没有问题的,如果返回结果有多个,那么就会报异常
1.普通使用
@Test
public void testQBC(){
//1.创建一个Criteria对象
Criteria criteria=session.createCriteria(Employee.clss);
//2.添加查询条件:在QBC中查询条件使用Criterion来表示
//Criterion可以通过Restrictions 的静态方法得到
//Restrictions.eq相当于等于,Restrictions.gt相当于大于。
criteria.add(Restrictions.eq("email","1234@qq.com"));
criteria.add(Restrictions.gt("salary",5000F))'
//3.查询
Employee employee=(Employee) criteria.uniqueResult();
System.out.println(employee);
2.and和or怎么作为查询条件
@Test
public void testQBC2(){
Criteria criteria=session.createCriteria(Employee.class);
//1.AND:使用Conjunction表示
//Conjunction本身就是一个Criterion对象
//且其中还可以添加Criterion对象
Conjunction conjunction=Restricions.conjunction();
conjunction.add(Restriction.like("name","a",MatchMode.ANYWHERE));
Department dept=new Department();
dept.setId(80);
conjunction.add(Restriction.eq("dept",dept));
System.out.prinln(conjunction); //打印结果:(name like %a% and dept=Department [id=80])
//2.OR
Disjunction disjunction=Restriction.disjunction();
disjunction.add(Restriction.ge("salary",6000F));
disjunction.add(Restriction.isNull("email"));
//添加查询条件
criteria.add(disjunction);
criteria.add(conjunction);
criteria.list(); //打印结果为: ......where ( this_.SALARY>=? or this_.EMAIL is null) and (this_.NAME like ? and this_.DEPT_ID=?)
}
3.统计查询
@Test
public void testQBC3(){
Criteria criteria=session.createCriteria(Employee.clss);
//统计查询:使用Projection来表示:可以由Projections的静态方法得到
criteria.setProjection(Projections.max("salart"));
System.out.println(criteria.uniqueResult());
}
4.排序,分页查询
@Test
public void testQBC4(){
Criteria criteria=session.createCriteria(Employee.clss);
//1.添加排序
criteria.addOrder(Order.asc("salary"));
criteria.addOrder(Order.desc("email"));
//2.添加分页方法
int pageSize=5;
int pageNo=3;
List() list=ceriteria.setFirstResult((pageNo-1)* pageSize).setMaxResults(pageSize).list();
System.out.println(list);
}
给一张表来看看qbc增加的条件查询语句。
本地SQL检索
- 使用标准的SQL语句来编写
步骤:
- 获得session
- 编写sql语句
- 获取SQLQuey对象:session.createSQLQuery(sql);
- 给sql语句设置参数。
- 执行查询
list():返回一个集合列表,集合中装的是Object[]。
返回实体类对象集合,如果与实体类进行了绑定,也就是使用了addEntity(xxx.class)。
1.SQLHelloWorld
@Test
public void testNationSQL(){
//2..编写sql语句
Stirng sql= "INSERT INTO GG_department VALUES(?,?)"; //为GG_department表插入一条记录
//3.获取SQLQuery对象
Query query =session.createSQLQuery(sql);
//4.给sql语句设置参数
query.setInteger(0,280)
.setString(1,"ATGUIGU")
.excuteUpdate(); //执行sql
}
2.SQLUpdate
@Test
public void testNationSQL(){
//编写SQL(删除id为37的这条记录),获取SQLQuery
Query query =session.createSQLQuery(DETETE FROM Department d WHERE d.id= :id");
//为sql设置参数
query.setInteger("id",37).executeUpdate();
}
3.查询Staff的所有记录,并且绑定实体。 addEntity。
//使用的就是数据库表名了。
SQLQuery SQLquery = session.createSQLQuery("select * from staff");
//返回的是一个List<Object[]> 只有通过addEntity。来绑定实体。
List<Staff> list = SQLquery.addEntity(Staff.class).list();
System.out.println(list.get(0).getName());
//结果
Hibernate:
select
*
from
staff
qqq1
可参考:http://www.cnblogs.com/whgk/p/6159336.html
还没有评论,来说两句吧...