Hibernate学习之QBC

来源:互联网 发布:securecrt linux版 编辑:程序博客网 时间:2024/05/16 14:04

/**
 * 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();
 
  
 
 }
}