Hibernate查询的方法
Hibernate查询的方法
一:hibernate多记录查询
1、原生SQL(Native SQL)查询
2、QBC查询
3、HQL查询
1、原生SQL(Native SQL)查询
session并没有提供直接查询多条记录的方法,但提供了间接查找多条记录的对象
通过session.createNativeQuery()获得query对象,该对象可以执行sql语句完成查询操作
2、QBC查询(Query By Criteria)
语法和机制上(对表的操作变成对对象的操作)都符合面向对象特点
注意:hibernate5.2以后,QBC就不推荐使用,因为在hibernate架构中引入了JPA
通过session.createCriteria(对象)或query.getSingleSelect(); 获得Criteria查询对象,获的Criteria对象的同时也指定了查询目标,Car类对应的表t_car
使用criteria.list() 执行查询操作,返回的查询结果中每条记录组成Car对象
/**
* QBC查询 criteria.list()
*/
public void find2(){
Session session=HibernateUtil.getSession();
Criteria criteria= session.createCriteria(Car1.class);
List<Car1> carList=criteria.list();
for(Car1 car1:carList){
System.out.println(car1);
}
}
2、QBC的过滤查询
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
//比较运算符 过滤
criteria.add(Restrictions.eq("cno",1));//相当于where cno = 1
criteria.add(Restrictions.ne("cno",1));//相当于where cno!=1
criteria.add(Restrictions.gt("cno",1));//相当于where cno>1
criteria.add(Restrictions.lt("cno",1));//相当于where cno<1
criteria.add(Restrictions.ge("cno",1));//相当于where cno>=1
criteria.add(Restrictions.le("cno",1));//相当于where cno<=1
//用isNull 或 isNotNull过滤
criteria.add(Restrictions.isNull("cname"));//where cname==null
criteria.add(Restrictions.isNotNull("cname"));//where cname!=null
//模糊查询 过滤
criteria.add(Restrictions.like("cname","%b%"));//相当于where cname like '%b%'
//betWeen(在什么之间的)过滤(区间)
criteria.add(Restrictions.between("price",2000000,500000));//相当于where price between 20万 and 30万
//in在20,25,30里面的过滤(点)
criteria.add(Restrictions.in("price",20,25,30));//相当于where price in (20,25,30)
//用and 过滤
criteria.add(Restrictions.and(Restrictions.eq("color","red"),Restrictions.lt("price",3000))); //where color='red' and price<3000
//or 过滤
criteria.add(Restrictions.or(Restrictions.eq("color","red"),Restrictions.lt("price",3000))); //where color='red' or price<3000
//注意当连续使用两次add增加过滤条件,自动就是and 如:
criteria.add(Restrictions.eq("cno",1));//相当于where cno = 1
criteria.add(Restrictions.eq("color","red"));
List<Car1> carList=criteria.list();
3、QBC的排序查询
/**
* QBC排序查询
*/
public void find(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
criteria.addOrder(Order.desc("price"));//按照price进行降序 相当于order by price desc
criteria.addOrder(Order.asc("color"));//按照price进行降序再按照color进行升序 相当于按照price进行升序 相当于order by price desc,color asc
//注意:设置两次排序,自然就是安照两个添加排序
List<Car1> carList=criteria.list();
}
注意:设置两次排序,自然就是安照两个添加排序
4、QBC的分页查询
/**
* QBC分页查询
*/
public void find5(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
criteria.setFirstResult(1);//起始索引
criteria.setMaxResults(10);//每页显示长度
List<Car1> carList=criteria.list();
}
注意:这个分页使用所有的数据库
5、QBC的分组查询
字段投影:只查询表中部分字段的数据,如:select cname,color form t_car;
聚合函数:avg();sum();max();min();count()等
/**
* QBC字段投影和聚合函数
*/
public void find6(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
//做字段投影
criteria.setProjection(Projections.projectionList()
.add(Projections.property("cname"))
.add(Projections.property("color")).add(Projections.sum("price")));//相当于select cname,color,sum(price) form t_car
List list =criteria.list();
}
注意:投影以后,每条记录字段的信息就无法组成对象,最终组成Object数组
分组:
/**
* QBC分组
*/
public void find7(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
//分组
criteria.setProjection(Projections.projectionList()
.add(Projections.groupProperty("color"))//按照颜色分组
.add(Projections.count("cno"))
.add(Projections.max("price"))
.add(Projections.min("price").as("minPrice")));
//相当于:select color,count(cno),max(price),min(price) as minPrice form t_car group by color;
List list =criteria.list();
}
6、QBC的子查询
离线查询:子表
DetachedCriteria criteria1=DetachedCriteria.forClass(Car1.class);
criteria1.setProjection(Projections.avg(“price”));//相当于:select avg(price) form t_car;
/**
* QBC子查询
*/
public void find8(){
Session session=HibernateUtil.getSession();
Criteria criteria=session.createCriteria(Car1.class);
//离线查询
DetachedCriteria criteria1=DetachedCriteria.forClass(Car1.class);
criteria1.setProjection(Projections.avg("price"));//相当于:select avg(price) form t_car;
criteria.add(Property.forName("price").gt(criteria1));
//相当于:select * form t_car where price>(select avg(price) form t_car)
List list =criteria.list();
}
7、QBC的关联查询
HIbernate有一个非常强大的功能,就是关联关系处理,需要在ORM配置文件中配置两个对象之间的关联关系,在QBC查询时会自动关联
3、HQL查询
类似sql语法,面向对象机制的查询方式;简单的理解为将sql中的表换成实体,将sql中的字段换成属性,如:
sql:select * from t_tar where cno=?
hql:select * from Car where cno=?
注意:实际上上述hql语句是错误的,正确语句如下:
from Car where cno=?;
注意:hql中也可以使用select 查询部分属性
通过session.createQuery()方法获得hql查询的Query对象
Query query= session.createQuery(“from Car”);
使用query.list()或query.getSingleSelect()执行查询操作,查询的结果会自动组成对象
/**
* HQL查询
*/
public void find9(){
Session session=HibernateUtil.getSession();
Query query= session.createQuery("from Car");
List<Car1> car1s= query.list();
}
1、 HQL预处理传参:两种方式
第一种:from car where price >?1 注意:问号后面必须带数字
query.setParameter(1,2000);
第二种:from car where price > :price
query.setParameter(“price”,2000);
/**
* HQL 过滤查询
*/
public void find10(){
Session session=HibernateUtil.getSession();
Query query= session.createQuery("from Car where price > ?1");
query.setParameter(1,300000);
List<Car1> car1s= query.list();
}
2、HQL分页查询
/**
* HQL 分页查询
*/
public void find11(){
Session session=HibernateUtil.getSession();
Query query= session.createQuery("from Car where price >:price");
query.setParameter("price",300000);
query.setFirstResult(1);//从那条开始
query.setMaxResults(2);//一页显示几条
List<Car1> car1s= query.list();
}
3、HQL的投影和分组查询
/**
* HQL 投影和分组查询
*/
public void find12(){
Session session=HibernateUtil.getSession();
Query query= session.createQuery("select color,cout(cno) from Car group by color");
List car1s= query.list();
}
4、扩展:HQL的关联查询
hql有两种关联查询的情况
第一种:逻辑关系:使用hql语句表现两个表的关联关系;如:
from emp e ,Dept d where e.dno = d.dno;
注意:
- 不能使用join关联语法 2、查询结果是:List<Object[] {Emp,Dept}>
第二种:物理关联:后面再hibernate关联关系讲解时,需要再ORM中配置关系
物理关系就是:查询单个实体时,自动查询关联实体数据,只需要from emp 进行查询就可以查出关联信息
5、扩展:hql的批量删除和批量修改,类似与编写sql形式的hql删除/修改如:
update Car set price=price+1000;
delete from Car where cno=?1;
然后使用query.executeUpdate();方法执行增删改操作;注意事务
/**
* HQL 批量修改操作
*/
public void find13(){
Session session=HibernateUtil.getSession();
Query query= session.createQuery("update Car set price=price+11000");
session.beginTransaction();//开始事务
query.executeUpdate();
session.getTransaction().commit();//提交事务
}
4、扩展:JPA查询
1、需要创建CriteriaBuilder对象,构建查询模式
CriteriaBuilder builder=session.getCriteriaBuilder();
2、获得查询对象CriteriaQuery
CriteriaBuilder builder=session.getCriteriaBuilder();
注意:Car.class类型,表示查询结果组成的对象类型
3、获得目标对象Root
Root《Car1》 table=query.from(Car1.class);
4、构建查询
query.select(table);相当于 select * from t_car;
5、执行查询
List cars= session.createQuery(query).list();
Car1 car1= session.createQuery(query).getSingleResult();
/**
* API查询
*/
public void find14(){
Session session=HibernateUtil.getSession();
//1、需要创建CriteriaBuilder对象,构建查询模式
CriteriaBuilder builder=session.getCriteriaBuilder();
//2、获得查询对象CriteriaQuery
CriteriaQuery<Car1> query=builder.createQuery(Car1.class);
//3、获得目标对象Root
Root<Car1> table=query.from(Car1.class);
//4、构建查询
query.select(table);//相当于 select * from t_car;
//5、执行查询
List<Car1> cars= session.createQuery(query).list();
Car1 car1= session.createQuery(query).getSingleResult();
}
1、JAP过滤查询
/**
* JAP过滤查询
*/
public void find15(){
Session session=HibernateUtil.getSession();
//1、需要创建CriteriaBuilder对象,构建查询模式
CriteriaBuilder builder=session.getCriteriaBuilder();
//2、获得查询对象CriteriaQuery
CriteriaQuery<Car1> query=builder.createQuery(Car1.class);
//3、获得目标对象Root
Root<Car1> table=query.from(Car1.class);
//4、构建查询
query.select(table).where(builder.notEqual(table.get("cno"),1));//相当于 select * from t_car where cno!=1;
//5、执行查询
List<Car1> cars= session.createQuery(query).list();
Car1 car1= session.createQuery(query).getSingleResult();
}
query.select(table).where(builder.notEqual(table.get(“cno”),1));其余方法用builder点就出来了
2、JPA排序查询
/**
* JAP排序查询
*/
public void find16(){
Session session=HibernateUtil.getSession();
//1、需要创建CriteriaBuilder对象,构建查询模式
CriteriaBuilder builder=session.getCriteriaBuilder();
//2、获得查询对象CriteriaQuery
CriteriaQuery<Car1> query=builder.createQuery(Car1.class);
//3、获得目标对象Root
Root<Car1> table=query.from(Car1.class);
//4、构建查询
query.select(table);
query.orderBy(builder.desc(table.get("price")),builder.asc(table.get("cno")));
//5、执行查询
List<Car1> cars= session.createQuery(query).list();
Car1 car1= session.createQuery(query).getSingleResult();
}
3、JAP分页查询
/**
* JAP分页查询
*/
public void find17(){
Session session=HibernateUtil.getSession();
//1、需要创建CriteriaBuilder对象,构建查询模式
CriteriaBuilder builder=session.getCriteriaBuilder();
//2、获得查询对象CriteriaQuery
CriteriaQuery<Car1> query=builder.createQuery(Car1.class);
//3、获得目标对象Root
Root<Car1> table=query.from(Car1.class);
//4、构建查询
query.select(table);
//5、执行分页查询
List<Car1> cars= session.createQuery(query).setFirstResult(2).setMaxResults(3).list();
}
4、JAP分组查询
投影查询(查询部分字段):注意投影查询的部分字段不能组成完整的Car对象,需要为投影字段专门定义一个类对象(再单独写一个投影字段的类)设置CriteriaQuery的泛型为新类型Car2
CriteriaQuery《Car2》query=builder.createQuery(Car2.class);
构建查询时,不再使用query.select()方法,而是如下方法:
query.multiselect(table.get(“cname”),table.get(“color”));
List《Car2》 cars= session.createQuery(query).list();
基于投影查询的聚合查询
分组查询
5、JPA子查询