hibernate-criteria查询(二)
Restrictions 类的作用是什么?
Criteria 接口没有 iterate() 方法。
Criteria 查询如何对查询结果排序、分页?
Criteria 查询如何实现关联?
Criteria 查询如何实现分组聚合?
DetachedCriteria 有什么作用?
用代码告诉你:
package Test; import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.Session; import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.junit.Test; import entity.Dept;
import entity.Emp;
import entity.QueryCondition; import util.HibernateSessionFactory; //criteria查询
public class TestCriteria { @Test
public void Test1(){
Session session =HibernateSessionFactory.getSession();
try {
Criteria criteria = session.createCriteria(Emp.class);
Iterator<Emp> iter = criteria.list().iterator();
while(iter.hasNext()){
Emp emp=iter.next();
System.out.println(emp.getEname());
}
} catch (Exception e) {
// TODO: handle exception
}
}
/* 职位是工程师,如:job = ‘engineer’
工资大于2000元,如:salary > 2000
入职时间在2006年12月31日至2008年12月31日之间
模糊查询的时候可以使用
criteria动态查询
*/
@Test
public void Test2(){
Session session =HibernateSessionFactory.getSession();
try {
Criteria criteria = session.createCriteria(Emp.class);
QueryCondition queryCondition=new QueryCondition();
queryCondition.setStartdate(new SimpleDateFormat("yyyy-MM-dd").parse("1980-12-17"));
queryCondition.setEnddate(new SimpleDateFormat("yyyy-MM-dd").parse("1987-12-32"));
Emp emp =new Emp();
emp.setSal(2000D);
//emp.setJob("SALESMAN");
if(queryCondition.getStartdate()!=null){
criteria.add(Restrictions.gt("hiredate",queryCondition.getStartdate() ));
}
if(queryCondition.getEnddate()!=null){
criteria.add(Restrictions.lt("hiredate",queryCondition.getEnddate() ));
}
if(emp.getSal()!=null){
criteria.add(Restrictions.gt("sal", 2000D));
}
if(emp.getJob()!=null){
criteria.add(Restrictions.eq("job", "SALESMAN"));
} List<Emp> emplist = criteria.list();
for (Emp emp1 : emplist) {
System.out.println(emp1.getJob()+"\t"+emp1.getSal()+"\t"+emp1.getHiredate());
}
} catch (Exception e) {
// TODO: handle exception
}
} /* 职位是工程师,如:job = ‘engineer’
工资大于2000元,如:salary > 2000
入职时间在2006年12月31日至2008年12月31日之间
模糊查询的时候可以使用,加上分页
*/
@Test
public void Test3(){
Session session =HibernateSessionFactory.getSession();
try {
Criteria criteria = session.createCriteria(Emp.class);
QueryCondition queryCondition=new QueryCondition();
queryCondition.setStartdate(new SimpleDateFormat("yyyy-MM-dd").parse("1980-12-17"));
queryCondition.setEnddate(new SimpleDateFormat("yyyy-MM-dd").parse("1987-12-32"));
Emp emp =new Emp();
emp.setSal(2000D);
//emp.setJob("SALESMAN");
if(queryCondition.getStartdate()!=null){
criteria.add(Restrictions.gt("hiredate",queryCondition.getStartdate() ));
}
if(queryCondition.getEnddate()!=null){
criteria.add(Restrictions.lt("hiredate",queryCondition.getEnddate() ));
}
if(emp.getSal()!=null){
criteria.add(Restrictions.gt("sal", 2000D));
}
if(emp.getJob()!=null){
criteria.add(Restrictions.eq("job", "SALESMAN"));
}
//设置每页显示多少条
int pageSize=2;
int pageNo=2;//当前第几页
//得出总页数
int totalCount =(Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
int totalPage = totalCount%pageSize==0?totalCount/pageSize:totalCount/pageSize+1;
criteria.setProjection(null);
criteria.setFirstResult((pageNo-1)*pageSize);//从第几条查询
criteria.setMaxResults(pageSize);//最多显示几条 List<Emp> emplist = criteria.list();
for (Emp emp1 : emplist) {
System.out.println(emp1.getJob()+"\t"+emp1.getSal()+"\t"+emp1.getHiredate());
}
} catch (Exception e) {
// TODO: handle exception
}
} /*criteria排序
* 按员工工资降序排列
* */
@Test
public void test4(){
Session session =HibernateSessionFactory.getSession();
try {
Criteria criteria = session.createCriteria(Emp.class,"e");
criteria.add(Restrictions.gt("sal", 2000D));
//criteria.addOrder(Order.asc("sal"));//按工资升序
criteria.addOrder(Order.desc("empno"));//按工号降序
List<Emp> emplist = criteria.list();
for (Emp emp : emplist) {
System.out.println(emp.getEmpno()+"\t"+emp.getEname()+"\t"+emp.getSal());
}
} catch (Exception e) {
e.printStackTrace();
}
} /*查询工资最高的员工*/
@Test
public void test5(){
Session session =HibernateSessionFactory.getSession();
try {
Object obj=session.createCriteria(Emp.class,"e")
.add(Restrictions.isNotEmpty("e.sal"))
.addOrder(Order.desc("e.sal"))
.setMaxResults(1)
.uniqueResult(); System.out.println(obj.toString()); } catch (Exception e) {
e.printStackTrace();
}
} /*联合查询
*
* MatchMode.START:字符串在最前面的位置.相当于"like 'key%'"
MatchMode.END:字符串在最后面的位置.相当于"like '%key'"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%key%'"
MatchMode.EXACT:字符串精确匹配.相当于"like 'key'"
* */
@SuppressWarnings("unchecked")
@Test
public void test6(){
Session session =HibernateSessionFactory.getSession();
try {
List<Emp> emplist=session.createCriteria(Emp.class,"e")
.add(Restrictions.ilike("e.ename", "A",MatchMode.ANYWHERE))
.createAlias("dept", "d").add(Restrictions.eq("d.dname", "SALES")).list(); for (Emp emp : emplist) {
System.out.println(emp.getEname()+"\t"+emp.getDept().getDname());
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 查询部门名称
* 投影查询:属性查询
*/
@SuppressWarnings("unchecked")
@Test
public void test7(){
Session session =HibernateSessionFactory.getSession();
try {
List<String> deptlist = session.createCriteria(Dept.class).setProjection(Property.forName("dname")).list(); for (String string : deptlist) {
System.out.println(string);
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 查询部门名称
* 投影查询:查询员工姓名、工资和部门
*/
@SuppressWarnings("unchecked")
@Test
public void test8(){
Session session =HibernateSessionFactory.getSession();
try {
List<Object[]> deptlist = session.createCriteria(Emp.class,"e")
.createAlias("e.dept", "d")
.setProjection(Projections.projectionList()
.add(Property.forName("e.ename"))
.add(Property.forName("e.sal"))
.add(Property.forName("d.dname"))).list();
System.out.println(deptlist.size());
for (Object[] obj : deptlist) {
System.out.println(obj[0] + ","+obj[1]+","+obj[2]);
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 统计各个部门的平均工资、最高工资、最低工资
*/
@SuppressWarnings("unchecked")
@Test
public void test9(){
Session session =HibernateSessionFactory.getSession();
try {
List<Object[]> deptlist = session.createCriteria(Emp.class,"e")
.createAlias("e.dept", "d")
.setProjection(Projections.projectionList()
.add(Projections.groupProperty("d.dname"))
.add(Projections.avg("e.sal"))
.add(Projections.max("e.sal"))
.add(Projections.min("e.sal"))).list();
System.out.println("各部门平均工资、最高工资、最低工资是:============");
for (Object[] obj : deptlist) { System.out.println(obj[0] + ","+obj[1]+","+obj[2]);
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 使用DetachedCriteria查询财务部的姓名包括“a”的员工
* DetachedCriteria 和 Criteria 功能类似
Criteria是由Session对象创建的,
DetachedCriteria创建时不需要Session对象
可以把DetachedCriteria作为方法参数传递来构造查
询条件
*/
@SuppressWarnings("unchecked")
@Test
public void test10(){
Session session =HibernateSessionFactory.getSession();
try {
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class,"e")
.createAlias("e.dept", "d")
.add(Restrictions.eq("d.dname", "SALES"))
.add(Restrictions.ilike("e.ename", "a",MatchMode.ANYWHERE));
List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
System.out.println("使用DetachedCriteria查询财务部的姓名包括“a”的员工==============");
for (Emp emp : list) {
System.out.println(emp.getEname()+"\t"+emp.getDept().getDname());
} } catch (Exception e) {
e.printStackTrace();
}
} /**
* 使用DetachedCriteria作为查询条件,查询工资高于平均工资的员工
*/
@SuppressWarnings("unchecked")
@Test
public void test11(){
Session session =HibernateSessionFactory.getSession();
try {
DetachedCriteria avgsal=DetachedCriteria.forClass(Emp.class,"e")
.setProjection(Projections.avg("e.sal"));
List<Emp> list = session.createCriteria(Emp.class,"e")
.createAlias("e.dept", "d")
.add(Property.forName("e.sal").gt(avgsal)).list();
for (Emp emp : list) {
System.out.println(emp.getEname()+"\t"+emp.getSal());
} } catch (Exception e) {
e.printStackTrace();
}
}
}
hibernate-criteria查询(二)的更多相关文章
- Hibernate Criteria 查询使用
转载 http://blog.csdn.net/woshisap/article/details/6747466 Hibernate 设计了 CriteriaSpecification 作为 Crit ...
- hibernate Criteria查询多对多(Set集合)条件筛选
PO public class UserPO implements java.io.Serializable { /** 用户唯一标识ID */ private String id; /** 状态(在 ...
- hibernate Criteria查询 2.3
Criteria对象提供了一种面向对象的方式查询数据库.Criteria对象需要使用Session对象来获得一个Criteria对象表示对一个持久化类的查询 查询所有 Session session ...
- Hibernate(十二)Criteria查询
一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate框架之Criteria查询
首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...
- Hibernate criteria 混合sql语句多表关联时查询注意事项
直接进入正题 假设有一个实体类 /** * 产品分类 */ public class ProductType{ @Id private String no;//编号 private String na ...
- Hibernate-ORM:15.Hibernate中的Criteria查询
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介: 刚接触Hibernate ...
- 第六讲(二) Hibernate HQL查询
HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibe ...
- Hibernate查询之Criteria查询
转自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html Criteria是一种比hql更面向对象的查询方式.Criteria ...
随机推荐
- 0025 Java学习笔记-面向对象-final修饰符、不可变类
final关键字可以用于何处 修饰类:该类不可被继承 修饰变量:该变量一经初始化就不能被重新赋值,即使该值跟初始化的值相同或者指向同一个对象,也不可以 类变量: 实例变量: 形参: 注意可以修饰形参 ...
- 《java JDK7 学习笔记》之对象封装
1.构造函数实现对象初始化流程的封装.方法封装了操作对象的流程.java中还可以使用private封装对象私有数据成员.封装的目的主要就是隐藏对象细节,将对象当做黑箱子进行操作. 2.在java命名规 ...
- 曲演杂坛--当ROW_NUMBER遇到TOP
值班期间研发同事打来电话,说应用有超时,上服务器上检查发现有SQL大批量地执行,该SQL消耗IO资源较多,导致服务器存在IO瓶颈,细看SQL,发现自己都被整蒙了,不知道这SQL是要干啥,处理完问题赶紧 ...
- ASP.NET SignalR
何为ASP.NET SignalR,有什么用 ASP.NET SignalR是一个ASP.NET库,是为了实现实时web通信而创造的,能让服务器与客户端实现即时通信,而不需要服务器等待接收到客户端请求 ...
- C#基础---Attribute(标签) 和 reflect(反射) 应用
1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Micros ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- NOIP2001统计单词个数[序列DP]
题目描述 给出一个长度不超过200的由小写英文字母组成的字母串(约定;该字串以每行20个字母的方式输入,且保证每行一定为20个).要求将此字母串分成k份(1<k<=40),且每份中包含的单 ...
- Unity新功能|全息模拟器
http://forum.china.unity3d.com/thread-21539-1-1.html
- [bzoj1597][usaco2008 mar]土地购买 (动态规划+斜率优化)
Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块土地的长宽满足(1 <= 宽 <= 1,000, ...
- Error:Execution failed for task ':app:transformClassesWithDexForDebug'解决记录
转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50511172 本文出自:[lxk_1993的博客]: 3个错误non-zero e ...