/**
* QBC:Query by Criteria按照规则查询
* 通过java类型库把sql全面封装。架构师最爱。将sql都封装
*/
public void testQBC(){
//基本查询
Session session= HibernateSessionFactory.getSession();
//查询全部
Criteria cri= session.createCriteria(Employees.class);//等价于select * from Employees
//条件查询。条件可以很多。但是每一个条件都封装到Criterion接口
//条件是实现类是Expression或者Restrictions他们都可以得到Criterion
//Expression过期。是老版的。
//条件查询 =
Criterion c1= Restrictions.eq("firstName", "Steven");//这句话等价于:where firstname='Steven'
//> >= < <= !=
Criterion c2=Restrictions.gt("salary", 7000.00);
Criterion c3=Restrictions.ge("salary", 7000.00);
Criterion c4=Restrictions.lt("salary", 7000.00);//<
Criterion c5=Restrictions.le("salary", 7000.00);//<=
//and
Criterion c6=Restrictions.and(c1, c2);
//or
Criterion c7=Restrictions.or(c1, c2);
//not
Criterion c8=Restrictions.not(c1);
//空比如firstName='' firstName!=''
Criterion c9= Restrictions.eq("firstName", "");//这句话等价于:where firstname='Steven'
//表示与列关联的外表的数据是没有
Criterion c10=Restrictions.isEmpty("departmentses");//<=
Criterion c11=Restrictions.isNotEmpty("departmentses");//<=
//判断外键表的条数。条件和isEmpty只能判断Set类型
Criterion c14=Restrictions.sizeEq("departmentses",2);//<=
Criterion c15=Restrictions.sizeGt("departmentses",2);//<=
Criterion c16=Restrictions.sizeGe("departmentses",2);//<=
Criterion c17=Restrictions.sizeLt("departmentses",2);//<=
Criterion c18=Restrictions.sizeLe("departmentses",2);//<=
//null比如firstName is null firstName is not null
Criterion c12=Restrictions.isNull("firstName");//
Criterion c13=Restrictions.isNotNull("firstName");//
//in
Object params[]={"Steven","Lex"};
List paraList=new ArrayList();
paraList.add("Steven");
Criterion c19=Restrictions.in("firstName", params);
Criterion c20=Restrictions.in("firstName", paraList);
//in如何查询外键
Criteria depCri=session.createCriteria(Departments.class)
.add(Restrictions.gt("departmentId", new Short((short)100)));
Criterion c21=Restrictions.in("departments",depCri.list());
//like,属于精确查询
Criterion c22=Restrictions.like("firstName", "Lex");
//like匹配
Criterion c23=Restrictions.like("firstName", "L",MatchMode.START);//L%
Criterion c24=Restrictions.like("firstName", "L",MatchMode.END);//%L
Criterion c25=Restrictions.like("firstName", "L",MatchMode.EXACT);//=L
Criterion c26=Restrictions.like("firstName", "L",MatchMode.ANYWHERE);//%L%
//排序
//cri.addOrder(Order.desc("employeeId"));
//cri.addOrder(Order.asc("employeeId"));
//分页
// cri.setMaxResults(20)
// .setFirstResult(10);
//唯一性
//cri.uniqueResult();
//like==ilike
Criterion c27=Restrictions.ilike("firstName", "L",MatchMode.ANYWHERE);//%L%
Map<String,String> hashmap=new HashMap<String, String>();
hashmap.put("firstName", "Steven");
hashmap.put("lastName", "King");
//alleq
Criterion c28=Restrictions.allEq(hashmap);
//between..and
Criterion c29=Restrictions.between("employeeId", 100, 102);
//idEq等价于load,get。根据id找
Criterion c30=Restrictions.idEq(100);
//专门匹配列之间的比较
Criterion c31=Restrictions.gtProperty("salary", "departments.departmentId");
//联结查询 ,作业
//分组,作业
ProjectionList gp= Projections.projectionList()
.add(Projections.groupProperty("jobs.jobId"))
.add(Projections.max("salary"));
cri.setProjection(gp);//将条件汇总。进行分析查询
//统计分析,作业
//定义统计分析的条件
ProjectionList pl= Projections.projectionList()
.add(Projections.avg("salary"))
.add(Projections.max("salary"));
//cri.setProjection(pl);//将条件汇总。进行分析查询
//条件查询组合,作业
//cri.add(c31);//,作业
//得到结果
//离线查询。仅供了解。因为离线查询是spring和hibernate整合时
//管用的类。离线查询指。先把hibernate查询的原理+算法+发sql都存放在hbiernate内核
//当用户激活session。此时查询执行。这就有点“预处理”的味道
DetachedCriteria dc=DetachedCriteria.forClass(Employees.class)
.add(c29);
//激活离线查询
//Criteria cri2= dc.getExecutableCriteria(session);
Criteria cri2= session.createCriteria(Employees.class);
cri2.add(Restrictions.naturalId());
List list=cri2.list();
System.out.println(list);
//
}
public static void main(String[] args) {
new TeacherDAO().testQBC();
}
/**
* 根据id直接在持久层找这个标志的对象
* 这种查找方法又叫做OID查询。OID查询是经典的立即检索策略查询
* 也就是说。通过他。会把表里面所有的从表。从表的从表都会加载到内存。
* 会简化查从表的数据的难度。
* @param id
* @return
*/
public Teacher findById(Serializable id){
//1.得到链接
Session session=HibernateSessionFactory.getSession();
//从持久层根据id找对象
//方法1.
//return (Teacher)session.get(Teacher.class, id);
//方法2
// return (Teacher)session.get("com.tb.test.pojo.Teacher", id);
//方法3
// return (Teacher)session.load(Teacher.class, id);
//方法4
//我们也可以通过hql查询通过id找
// Query q=session.createQuery("from com.tb.test.pojo.Teacher where id=?")
// .setBigDecimal(0, (BigDecimal)id);
//
// return (Teacher)q.list().get(0);
//方法5
//HQL有一种唯一性查询
Query q=session.createQuery("from com.tb.test.pojo.Teacher where id=?")
.setBigDecimal(0, (BigDecimal)id);
return (Teacher)q.uniqueResult();
}
}