package test;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import beans.ClassInfo;
import beans.Student;
import factory.HibernateSessionFactory;
/**
* http://blog.csdn.net/an_2016/article/details/52003559
*
* QBC(Query By Criteria) API提供了检索对象的另一种方式,一种比hql更面向对象的查询方式。
*
* 条件查询是根据面向对象特色的数据查询方式,条件查询通过如下三个类完成:
Criteria:代表一次查询
Criterion:代表一个查询条件
Restrictions:产生查询条件的工具类
Projection :投影 只查询某些字段
*/
public class QBC_Test
{
public static void main(String[] args)
{
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
/*
//1.查询一个表中的数据所有数据,结果可以封装一个对应的实体类
//参一:要查询的类的Class对象 参二:别名
Criteria c1 = session.createCriteria(Student.class, "s");
List<Student> list1 = c1.list();
System.out.println(list1);
*/
/*
//2.查询某个字段 :获取结果应用 对应类型的List集合
Criteria c2 = session.createCriteria(Student.class);
//投影 查询部分字段
PropertyProjection projection = Projections.property("sname");
c2.setProjection(projection);
List<String> list2 = c2.list();
System.out.println(list2);
*/
/*
//3.查询多个字段:对应的结果类型Object[]
Criteria c3 = session.createCriteria(Student.class);
//投影集合
ProjectionList pList = Projections.projectionList();
pList.add(Projections.property("sname"));
pList.add(Projections.property("ssex"));
pList.add(Projections.property("sage"));
c3.setProjection(pList);
//查询
List<Object[]> list3 = c3.list();
for(Object objs[]:list3)
{
System.out.println(objs[0]+" "+objs[1]+" "+objs[2]);
}
*/
/*
//4.带条件的查询
Criteria c4 = session.createCriteria(Student.class,"s")
.setProjection(
Projections.projectionList()
.add(Projections.property("sname"))
.add(Projections.property("ssex"))
.add(Projections.property("sage")));
//查询条件 Restrictions
//eq | ne | gt | ge | lt | le
//等于,不等于,大于,大于等于,小于,小于等于指定值
//c4.add(Restrictions.eq("sage", 28));
//c4.add(Restrictions.gt("sage", 28));
//c4.add(Restrictions.eq("ssex", "male"));
//c4.add(Restrictions.isNull("s.classInfo.cid"));
//c4.add(Restrictions.isNotNull("s.classInfo.cid"));
//c4.add(Restrictions.like("sname", "%小%"));
//c4.add(Restrictions.sizeEq("s.subjects", 1));//判断某集合属性的长度
//c4.add(Restrictions.isEmpty("s.subjects"));//判断某集合属性是否为空
//当添加多个条件时,默认是使用and连接
//添加or的逻辑
c4.add(Restrictions.or(
Restrictions.gt("sage", 30),
Restrictions.eq("ssex", "male")
));
//查询
List<Object[]> list4 = c4.list();
for(Object objs[]:list4)
{
System.out.println(objs[0]+" "+objs[1]+" "+objs[2]);
}
*/
/*
//5.查询一班学生的信息,包括学生的 姓名,年龄,班级名字
Criteria c5 = session.createCriteria(Student.class,"s")
.createCriteria("s.classInfo", "c");
//投影
c5.setProjection(Projections.projectionList()
.add(Projections.property("s.sname"))
.add(Projections.property("s.sage"))
.add(Projections.property("c.cname")));
//加条件
c5.add(Restrictions.eq("c.cname", "一班"));
List<Object[]> list5 = c5.list();
for(Object objs[]:list5)
{
System.out.println(objs[0]+" "+objs[1]+" "+objs[2]);
}
*/
/*
//6.聚合函数 查询总共有多少个学生 返回的结果是一行一个字段
Criteria c6 = session.createCriteria(Student.class);
c6.setProjection(Projections.count("sid"));
long count = (long) c6.uniqueResult();
System.out.println("人数:"+count);
*/
/*
//7.分组查询 查询每个班级有多少人,显示班级名字,人数
Criteria c7 = session.createCriteria(Student.class,"s")
.createCriteria("s.classInfo", "c");
//设置投影
c7.setProjection(Projections.projectionList()
.add(Projections.groupProperty("c.cid"))
.add(Projections.groupProperty("c.cname"))
.add(Projections.count("s.sid")));
List<Object[]> list7 = c7.list();
for(Object objs[]:list7)
{
System.out.println(objs[0]+" "+objs[1]+" "+objs[2]);
}
*/
/*
//8.分页查询
Criteria c8 = session.createCriteria(Student.class,"s");
c8.setFirstResult(0);//第一条纪录的索引位置
c8.setMaxResults(5);//最多返回多少行
//排序
c8.addOrder(Order.desc("sage"));
List<Student> list8 = c8.list();
for(Student stu:list8)
System.out.println(stu);
*/
//9.查询一班的所有学生的信息 子查询
//离线查询 即使session已经关闭了,你可以在别的session上面运行
//离线查询,查询一班的 id
DetachedCriteria query = DetachedCriteria.forClass(ClassInfo.class)
.setProjection(Property.forName("cid"))
.add(Restrictions.eq("cname", "一班"));
Criteria c9 = session.createCriteria(Student.class,"s")
.add(Property.forName("s.classInfo.cid").in(query));
List<Student> list9 = c9.list();
for(Student stu:list9)
System.out.println(stu);
tx.commit();
session.close();
}
}
评论0
最新资源