Java笔记之hibernate(三):HQL

1.概念

  HQL是Hibernate Query Language的缩写,是一种面向对象的查询语言,类似于SQL,但不是针对表和列进行操作,而是针对对象和属性.

2.前提

  基于Hibernate增删改查项目

3.添加额外的jar包,并Build Path

4.新建HqlTest类

package com.hibernate.demo.test;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;

import com.hibernate.demo.bean.Employee;

public class HqlTest {

    public static void main(String[] args) {
        //加载配置文件,创建会话工厂对象
        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
        //创建会话对象
        Session session = sessionFactory.openSession();
        
        //调用查询方法
        HqlSelect(session,13);
        
        //关闭会话对象
        session.close();
        //关闭会话工厂对象
        sessionFactory.close();
    }
    
    /**
     * 使用Hql根据id进行查询
     * @param session
     */
    private static void HqlSelect(Session session,Integer id){
        //编写Hql语句,创建Query对象
        Query query = session.createQuery("from Employee emp where emp.empId=?");
        query.setInteger(0, id);
        //获取结果集合
        List<Employee> list = query.list();
        //如果结果集大小大于0,就获取第一个结果对象
        if(list.size()>0){
            Employee employee = list.get(0);
            System.out.println(employee);
        }else{
            System.out.println("没有指定id对应的结果对象");
        }
    }
    
    /**
     * 使用Hql进行模糊查询
     * @param session
     */
    private static void HqlSelect2(Session session,String name){
        //编写Hql语句,创建Query对象
        Query query = session.createQuery("from Employee emp where emp.empName like ?" );
        //对指定索引的占位符设置值,索引从0开始
        query.setString(0, "%"+name+"%");
        //获取结果集合
        List<Employee> list = query.list();
        //遍历结果集合
        for (Employee employee : list) {
            System.out.println(employee);
        }
    }
    
    /**
     * 使用Hql更新指定id对应的信息
     * @param session
     * @param id
     */
    private static void HqlUpdate(Session session,Integer id){
        //开启事务
        Transaction transaction = session.beginTransaction();
        //编写Hql修改语句,获取Query对象
        Query query = session.createQuery("update Employee set empName='emp222' where empId=?");
        //设置占位符的值
        query.setInteger(0, id);
        //执行修改操作,返回受影响的行数
        int num = query.executeUpdate();
        System.out.println("影响的行数为:"+num);
        //提交事务
        transaction.commit();
        //执行查询
        HqlSelect(session, id);
    }
    
    /**
     * 使用Hql删除指定id对应的信息
     * @param session
     * @param id
     */
    private static void HqlDelete(Session session, Integer id) {
        //开启事务
        Transaction transaction = session.beginTransaction();
        //编写Hql删除语句,删除指定id对应的信息
        Query query = session.createQuery("delete from Employee where empId=?");
        //设置占位符的值
        query.setInteger(0, id);
        //执行修改操作,返回受影响的行数--删除操作也是修改操作的一种,所以也是执行修改操作
        int num = query.executeUpdate();
        System.out.println("影响的行数为:"+num);
        //提交事务
        transaction.commit();
        //执行查询
        HqlSelect(session, id);
    }
}

5.调用查询方法并传参---HqlSelect(session,13),运行HqlTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select employee0_.emp_id as emp1_0_, employee0_.emp_name as emp2_0_ from t_employee employee0_ where employee0_.emp_id=?
Employee [empId=13, empName=emp111]

6.调用模糊查询方法并传参---HqlSelect2(session,"小"),运行HqlTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: select employee0_.emp_id as emp1_0_, employee0_.emp_name as emp2_0_ from t_employee employee0_ where employee0_.emp_name like ?
Employee [empId=6, empName=小明]
Employee [empId=7, empName=小红]
Employee [empId=8, empName=小兰]
Employee [empId=9, empName=小绿]

7.调用更新方法并传参---HqlUpdate(session, 13),运行HqlTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: update t_employee set emp_name='emp222' where emp_id=?
影响的行数为:1
Hibernate: select employee0_.emp_id as emp1_0_, employee0_.emp_name as emp2_0_ from t_employee employee0_ where employee0_.emp_id=?
Employee [empId=13, empName=emp222]

8.调用删除方法并传参---HqlDelete(session, 13),运行HqlTest类

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: delete from t_employee where emp_id=?
影响的行数为:1
Hibernate: select employee0_.emp_id as emp1_0_, employee0_.emp_name as emp2_0_ from t_employee employee0_ where employee0_.emp_id=?
没有指定id对应的结果对象

9.说明

  HQL是面向对象的查询语言,insert操作并不会引发任何的查询操作,所有它不能进行insert操作;

  update和delete操作都会根据条件先引发查询操作,所以HQL支持update和delete操作;

  更不用说select操作了;

猜你喜欢

转载自www.cnblogs.com/antusheng/p/12739399.html