HQL实用技术

在Hibernate中支持三种查询方式:HQL查询、Criteria查询以及SQL查询,HQL是一种面向对象的查询语言,其中没有表和字段的概念,只有类、对象和属性的概念。HQL的功能非常强大,能满足实际开发中的各种查询要求。
在编写HQL语句时HQL语句是不区分大小写的。

1.from子句
Hibernate中最简单的HQL语句形式如下:
指定了类的全限定路径
from cn.hibernatemo.entity.Dept
也可以为类起便命
from Dept as dept
2.select子句
select子句用于选取对象和属性
select dept.deptName from Dept as dept
选择了Dept类的属性deptName。
3.where子句
where子句用于表达查询的限制条件
from Dept where deptName=‘指定的名称’
属性为null或者非空则需要 is not null或is null
4.使用表达式
表达式一般用在where子句中即函数表达式例如:lower()、year()等hibernate支持的表达式。
5.order by 子句
order by 子句用于按指定属性排序
语法如下:
from Emp order by 属性1,属性2 desc
执行HQL语句
HQL编写号之后,我们需要session来创建一个Query对象,语句如下:
String hql=“from User”;//定义HQL语句
Query query =session.createQuery(hql);//构建query对象
List userList=query.list();//执行查询
一般我们使用foreach循环遍历出结果,或者使用迭代器iterator,语句如下:
public static void main(String[] args) {
//更新
Transaction tx=null;
Session session=null;
try {
session=HibernateUtil.getCurrectionSession();
tx=session.beginTransaction();
/* User user=(User) session.load(User.class,1122);//更新时根据id查询是否有此用户
//load方法是延迟加载不管是否有此对象id会赋给该对象。
user.setEmpName(“肥熊3219”);
tx.commit();//使用脏检查来实现更新数据*/
//使用HQL现实查询多条记录以及多条件查询
String hql=“from User”;
/* List userList= session.createQuery(hql).list();
//使用foreach
for (User user: userList) {
System.out.println(“编号:”+user.getEmpNo()+"\t"+“姓名:”+user.getEmpName());
}*/
Iterator userList=session.createQuery(hql).iterate();
//使用iterator遍历
User user=null;
while(userList.hasNext()){
user=userList.next();
System.out.println(“使用iterator遍历”+user.getEmpName());
}
tx.commit();
} catch (HibernateException e) {
e.printStackTrace();
if (tx!=null){
tx.rollback();
}
}
}
如何在HQL语句中绑定参数
参数绑定的形式:
1.按参数位置绑定
在HQL语句中用"?"占位符定义参数的位置。
示例如下:

 String hql="from User where empName=?";
 
Iterator<User> userList=session.createQuery(hql).setString(0,"TURNER").iterate();

2.按参数名称绑定
例如:

        String hql1="from User where empName= :ename";
        
          Iterator<User> 
          userList=session.createQuery(hql1).setString("ename","TURNER").iterate();
       其中按参数名来绑定比按位置(下标)绑定参数的可读性较好。
       除了这两种方式还有setParameter(index,Object)方法、setProperties(Object obj)这种方式是将HQL语句中的参数与它的属性绑定。
       HQL除了能使用list()、iterate()方法获取查询结果集,也可以使用uniqueResult()方法获取唯一结果,一般用于查询总记录数时使用,如果查询结果不唯一使用了这个方法会报错。
       **如何使用HQL语句实现分页**
       示例如下:
       
        /**
    * 使用HQL语句实现分页查询的功能
   */
public static List<User> Test_Page(Integer pageNo,Integer pageSize){
      session=HibernateUtil.getCurrectionSession();
      transaction=session.beginTransaction();
      String hql="from User order by empNo";
      return session.createQuery(hql).setFirstResult((pageNo-1)*pageSize).setMaxResults(pageSize).list();
}

**使用投影查询**
       有时候我们不需要获取对象的全部属性,而只需要获取对象的一个或几个属性,或者需要通过表达式、聚合函数等方式得到某些结果,此时可以使用投影查询。投影查询需要使用HQL的select子句,对于投影结果的方式有以下三种常见情况。
       1.每条查询结果仅包含一个结果列。
       
             /**
 * 使用投影查询结果
 */
public static List<String> Test_Use(){
    session=HibernateUtil.getCurrectionSession();
    transaction=session.beginTransaction();
    String hql="select empName from User";
    return session.createQuery(hql).list();
}
2.如果查询的不只是一个结果列,我们就要把上面那个方法的返回类型修改为List<Object[]>
3.将每条查询结果通过构造方法封装成对象。
  就是以对象的方式使用查询结果,示例如下:
  
       /**
 * 使用投影查询结果--将每条查询结果通过构造方法
 */
 public static List<User> Test_use_construct(){

     session=HibernateUtil.getCurrectionSession();
     transaction=session.beginTransaction();
     String hql="select new User(empNo,empName) from User";
     return session.createQuery(hql).list();
 }
 其中,我们在创建一个SSH框架时,这些实体类和映射文件都是自己手动创建的,但是在eclipse中有一个反向工具,它会根据数据表生成持久化类(实体类)和映射文件的工具,该工具成为Hibernate反向工具。具体的操作,下次再说明。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值