hibernate框架四
九.Criteria查询
什么是Criteria
Hibernate提供的完全面向对像的查询方式,让不熟悉SQL及HQL语法的人也可以使用hibernateAPI操作数据库
使用HQL的步骤
- 获取Session对像
- 创建Criteria接口
- 向Criteria接口中封装查询信息
- 返回结果
查询方式
返回集合类型数据
public List<Student> selectAll(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
//返回Criteria接口对像
Criteria ctr = session.createCriteria(Student.class);
//使用该接口的list()方法
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
有条件的查询
public Student selectByItem(int id){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
Student stu = null;
try {
Criteria ctr = session.createCriteria(Student.class);
//创建条件对像Criterion,用来封装查询条件
Criterion con = Restrictions.eq("id", id);//Restrictions,其中静态方法用来标识条件类型
//Criteria接口关联条件对像
ctr.add(con);
//返回单一结果
stu = (Student) ctr.uniqueResult();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return stu;
}
复合条件查询
public List<Student> selectByItem2(int id,String name){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
Criteria ctr = session.createCriteria(Student.class);
//创建条件对像Criterion,用来封装查询条件
Criterion con1 = Restrictions.eq("id", id);
Criterion con2 = Restrictions.eq("name", name);
Criterion con = Restrictions.or(con1, con2);
//Criteria接口关联条件对像
ctr.add(con);
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
排序
public List<Student> selectByOrder(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
Criteria ctr = session.createCriteria(Student.class);
//创建Order对像
Order order = Order.desc("id");//按Student类的id属性进行排序
//关联排序对像
ctr.addOrder(order);
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
分页查询
public List<Student> selectByPage(int firstResult,int maxResults){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
Criteria ctr = session.createCriteria(Student.class);
//分页
ctr.setFirstResult(firstResult);
ctr.setMaxResults(maxResults);
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
显示内连接查询
注意:createCriteria()和createAlias()的区别
- CreateAlias 返回值还是当前的Criteria对像,但是CreateCriteria返回的新的Criteria对像。
- 每个CreateCriteria实体的条件必须紧跟CreateCriteria的实体其后。而CreateAlias创建表别名的方式,只要在这个表的别名创建之后都可以再进行条件的添加(条件必须包含别名)
public List<Student> selectByJoin1(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
//内联接方式:clazz是Student类中POJO属性
//Criteria ctr = session.createCriteria(Student.class).createCriteria("clazz");
//Criteria ctr = session.createCriteria(Student.class).createAlias("clazz", "c");
Criteria ctr = session.createCriteria(Student.class,"s").createCriteria("clazz", "c");
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
//createCriteria()和createAlias()的区别示例
//第一种写法
var cri = session.CreateCrieria(Student.class)
.Add(Restrictions.Eq("name", "jack") //该条件需紧贴着Student
.CreateCrieria("clazz","c")
.Add(Restrictions.Eq("c.name","高三一班"); //该条件必须紧贴clazz之后
//第二种写法。
var cri = session.CreateCrieria(Student.class)
.CreateAlias("clazz","c")
.Add(Restrictions.Eq("c.name","高三一班");
.Add(Restrictions.Eq("name", "jack") //前后都没有关系,贴着role也可以。
外连接查询
public List<Student> selectByJoin2(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
Criteria ctr = session.createCriteria(Student.class,"s");
//clazz是Student类中POJO属性
ctr.setFetchMode("clazz", FetchMode.JOIN);//设置外连接方式
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
example实例查询
public List<Student> selectByExample(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Student> list = null;
try {
//创建Exmple实例
Student stu = new Student();
stu.setName("jack");
stu.setAge(20);
Criteria ctr = session.createCriteria(Student.class,"s");
//注意:stu对像中属性为null的值将不作为查询条件
ctr.add(Example.create(stu));
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
投影查询
使用Projection接口,和Projections类的projectList()来设置投影查询条件(分组,聚合函数…)
public List<Object> selectByProjection(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Object> list = null;
try {
Criteria ctr = session.createCriteria(Student.class,"s");
//封装投影属性
//Property和Projection继承关系
ctr.setProjection(Property.forName("name"));
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
public List<Object> selectByProjection2(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Object> list = null;
try {
Criteria ctr = session.createCriteria(Student.class,"s");
//查询多个属性时,请使用Projections.projectionList(),向其中封装相应属性即可
ctr.setProjection(Projections.projectionList().
add(Property.forName("name")).
add(Property.forName("age"))
);
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
分组查询
public List<Object[]> selectByGroup(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Object[]> list = null;
try {
Criteria ctr = session.createCriteria(Student.class,"s");
//使用Projections.projectionList()进行分组
ctr.setProjection(Projections.projectionList()
.add(Projections.groupProperty("sex"))
.add(Projections.rowCount())
.add(Projections.max("age"))
);
list = ctr.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}
DetachedCriteria离线查询
注意:DetachedCriteria和Criteria的区别
- Criteria由Session对像创建,而DetachedCriteria不需要使用Session
- DetachedCriteria可以作为方法参数传递来构建查询条件
public List<Object[]> selectByDetached(){
Session session = DBUtil.findSession();
Transaction tx = session.beginTransaction();
List<Object[]> list = null;
try {
//创建DetachedCriteria对像
DetachedCriteria dctr = DetachedCriteria.forClass(Student.class);
//向DetachedCriteria封装查询信息
dctr.setProjection(Projections.projectionList()
.add(Projections.groupProperty("sex"))
.add(Projections.rowCount())
.add(Projections.max("age"))
);
//关联session,创建可执行的Criteria
Criteria ct = dctr.getExecutableCriteria(session);
list = ct.list();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}
return list;
}