hibernate的三种查询方式

hibernate的三种查询方式


hibernate的查询方式常见的主要分为三种: HQL, QBC(命名查询), 以及使用原生SQL查询(SqlQuery);

1、HQL查询

1.1、SQL概述

HQLHibernate Query Language的缩写,提供更加丰富灵活、更为强大的查询能力;HQL接近SQL`语句查询语法。

完整的HQL语句形式如下:
select | update | deletefromwheregroup byhavingorder byasc|desc

其中的updatedeleteHibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。HQL查询在整个Hibernate实体操作体系中占核心地位。

String hql = "HQL语句";
Query query = session.createQuery(hql);
List list = query.list(); //查询得到多个实体对象集合
Object result = query.uniqueResult(); //查询得到一个实体对象
int x = query.executeUpdate(); //执行update或delete语句,返回数据表受影响行数
1.2、实体查询

查询过程中表名使用类名,列名使用属性名,类名和属性名称区分大小写

String hql="from Users";//from 实体类类型名称
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
    System.out.println(user);
}
1.3、带where的查询
Query query = session.createQuery("from Users where uid=3");
Users user = (Users) query.uniqueResult();//uniqueResult 单一对象
System.out.println(user);
Query query = session.createQuery("from Users where uid>5");
List<Users> list = query.list();
for (Users user : list) {
    System.out.println(user);
}
1.3、属性查询

查询部分属性

String hql="select u.uid,u.uname,u.upwd from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
for (Object[] objects : list) {
    System.out.println(Arrays.toString(objects));
}
String hql="select new Users(u.uname,u.upwd) from Users u where u.uname='张三'";
Query query = session.createQuery(hql);
List<Users> list = query.list();
for (Users user : list) {
    System.out.println(user);
}
1.4、实体的更新和删除

从hibernate 3版本开始才支持

//更新
String hql="update Users set uname='王五',upwd='321' where uid=3";
int res = session.createQuery(hql).executeUpdate();

//删除
String hql="delete from Users where uid=3";
int res = session.createQuery(hql).executeUpdate();
/*
返回值结果:
正整数:表受影响的行数据
0:		语句正常执行,但没有行受影响
负整数:通常是-1,执行HQL语句是一条查询语句
*/

HQL语句不能做添加

1.5、分组与排序
  • 排序

    处理方式和SQL语句中的排序是一样的

    String hql="from Users order by uid";
    Query query = session.createQuery(hql);
    List<Users> list = query.list();
    for (Users user : list) {
        System.out.println(user);
    }
    

    order by语句只能出现在语句的最后位置

  • 分组

    处理方式和SQL语句中分组查询相同

    分组语句需要处理筛选,只能使用having语句,而不能使用where语句。

    String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno";
    
    String hql = "select e.dept.deptno, count(e) from Emp e group by dept.deptno having count(e)>=5";
    
1.6、参数绑定
  • 使用占位参数

    String hql="from Users where uid=? or uname=?";
    Query query = session.createQuery(hql);
    //索引从0开始
    query.setInteger(0, 3);//query.setParameter(0, 3);
    query.setString(1, "张三");//query.setParameter(1, "张三");
    List<Users> list = query.list();
    for (Users user : list) {
        System.out.println(user);
    }
    
  • 使用参数名称

    String hql = "from Users where uid=:no1 or uid=:no2";
    Query query = session.createQuery(hql);
    query.setInteger("no1", 1);
    query.setInteger("no2", 3);
    //....
    
  • 可以使用点位参数和名称参数混合使用

    String hql = "from User where uid=? or uid=:no2";
    Query query = session.createQuery(hql);
    query.setInteger(0, 7788);
    query.setInteger("no2", 7566);
    //....
    //使用点位参数和名称参数混合使用,所有点位参数必须放在前面,一旦有名称参数出现,其后将不能再出现占位参数
    
1.7、连接查询
--SQL语句:查询员工姓名、薪资、部门名称
SELECT ENAME,SAL,DNAME 
FROM EMP e JOIN DEPT d ON e.DEPTNO=d.DEPTNO

SELECT ENAME,SAL,DNAME FROM EMP,DEPT WHERE EMP.DEPTNO=DEPT.DEPTNO
  1. 没有on语句
  2. 能被连接到查询中的必须是主查询对象的子属性
String hql="SELECT e.ename, e.sal, e.dept.dname FROM Emp e";

//HQL连接查询
String hql="SELECT e.ename, e.sal, d.dname FROM Emp e JOIN e.dept d";

String hql = "SELECT e FROM Emp e JOIN e.dept"; //JOIN将没有意义

String hql = "FROM Emp e JOIN e.dept";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
//List集合中的数组中会保存两个元素:
//0:主数据(Emp)
//1:从数据(Dept)


//查询编号为7788的员工信息,同时将对应的dept信息和manager信息查询并保存在对应的子属性中
String hql = "FROM Emp e JOIN FETCH e.dept d JOIN FETCH e.manager m WHERE e.empno=7788";
Query query = session.createQuery(hql);

Emp emp = (Emp) query.uniqueResult();
System.out.println(emp);
System.out.println(emp.getManager());
System.out.println(emp.getDept());
1.8、分页
String hql = "from Users";
Query query = session.createQuery(hql);
query.setFirstResult(0);
query.setMaxResults(2);

2、QBC查询

QBC(Query By Criteria)查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

QBC查询最重要的三个类:

  1. Restrictions 条件限制
  2. Projections 列设射
  3. Order 排序
2.1、查询实现
Criteria criteria = session.createCriteria(Users.class);
//session.createCriteria("entity.Users");
//session.createCriteria(Users.class, "别名");
List<Dept> list = criteria.list();

//查询单行结果(如果结果有两行或更多,会报错)
Object uniqueResult = criteria.uniqueResult();
2.2、Projections 列投射

语法:

//查询uname属性
Criteria criteria = session.createCriteria(Users.class);
PropertyProjection property = Projections.property("name");
criteria.setProjection(property);
List<Object> result = criteria.list();

//查询uname, upwd属性
Criteria criteria = session.createCriteria(Users.class);
//1.创建投射列表
ProjectionList projectionList = Projections.projectionList();
//2.向投射列表中添加列投射
PropertyProjection property1 = Projections.property("uname");
PropertyProjection property2 = Projections.property("upwd");
projectionList.add(property1).add(property2);
//3.将投射列表设置到准则中
criteria.setProjection(projectionList);
List<Object> result = criteria.list();
返回值类型方法名称描述
PropertyProjectionProjections.property指定某属性
AggregateProjectionProjections.avg求平均值
CountProjectionProjections.count统计某属性的数量
CountProjectionProjections.countDistinct统计某属性不同值的数量
PropertyProjectionProjections.groupProperty指定某个属性为分组属性
AggregateProjectionProjections.max求最大值
AggregateProjectionProjections.min求最小值
ProjectionListProjections.projectionList创建一个ProjectionList对象
ProjectionProjections.rowCount查询结果集中的记录条数
AggregateProjectionProjections.sum求某属性的合计
2.3、Restrictions 条件限制

语法:

Criteria criteria = session.createCriteria(Users.class);
Criterion notNull = Restrictions.isNotNull("comm");
criteria.add(notNull); //添加一个条件(如果添加了多个条件,默认条件之间使用and连接)
List<Users> list = criteria.list();
返回值类型方法名称描述
SimpleExpressionRestrictions.eq等于(equal)
CriterionRestrictions.allEq使用Map,Key/Valu进行多个等于的比对
SimpleExpressionRestrictions.gt大于(great than)
SimpleExpressionRestrictions.ge大于等于(great than or equal)
SimpleExpressionRestrictions.lt小于(less than)
SimpleExpressionRestrictions.le小于等于(less than or equal)
CriterionRestrictions.between对应SQL的between
SimpleExpressionRestrictions.like对应SQL的like
CriterionRestrictions.in对应SQL的in
LogicalExpressionRestrictions.andand关系
LogicalExpressionRestrictions.oror关系
CriterionRestrictions.isNull为空
CriterionRestrictions.sqlRestrictionSQL限定查询
CriterionRestrictions.not取反
2.3、Order排序

语法:

Criteria criteria = session.createCriteria(Dept.class);
criteria.addOrder(Order.asc("name"))
				.addOrder(Order.desc("loc"));
//SELECT * FROM DEPT ORDER BY name ASC, loc DESC
返回值类型方法名称描述
OrderOrder.asc(String propertyName)升序
OrderOrder.desc(String propertyName)降序
2.4、分页查询
Criteria criteria = session.createCriteria(Dept.class);
int pageNum = 2, pageSize = 5;
criteria.setFirstResult((pageNum-1)*pageSize); //查询起始行下标
criteria.setMaxResults(pageSize); //查询的最大行数
List list = criteria.list();

//setFirstResult方法和setMaxResults方法同样可以在SQLQuery及Query类型上使用

3、原生SQL查询

1、查询
String sql = "select uid,uname,upwd from _users";
List list = session.createSQLQuery(sql).list();
for(Object obj : list){
    System.out.println(obj);
}
2、 addEntity()
String sql = "select uid,uname,upwd from _users";
// addEntity()可以告诉Hibernate你想要封装成对象的类型,然后自动为你封装
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
List<User> list = query.list();
for(Users user : list){
System.out.println(user.getUname());
}
3、 uniqueResult
String sql = "select uid,uname,upwd from _users where uid = 2";
SQLQuery query = session.createSQLQuery(sql).addEntity(Users.class);
Users user = (Users) query.uniqueResult();//返回单一对象
System.out.println(user.getUname());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值