hibernateHQL查询

本文介绍了HQL查询的各种方法,包括简单属性查询、实体对象查询、条件查询、外置命名查询、原生SQL查询、分页查询、对象导航查询及连接查询,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HQL对大小写比较敏感,查询均为对象中的属性,而不是数据库中的表。
简单属性查询

//简单属性查询返回对象数组,如果是单个属性则返回与实体对象匹配的类型,其中Emp为实体类
public  void testQueryEmp(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        //查询基本属性方式一

        /*List  emps= session.createQuery("select empNo,empName from Emp").list();
        for(int i=0;i<emps.size();i++){
            Object[]  obj = (Object[]) emps.get(i);
            System.out.println(Arrays.toString(obj));
        }*/
        //查询基本属性方式二
        //如果需要返回对象则需要在实体对象中添加相应的构造方法
        List<Emp>  emps = session.createQuery("select new Emp(empNo,empName) from Emp").list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

实体对象查询

public  void testQueryEmp2(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        //使用list发送一条sql语句
//      List<Emp> emps = session.createQuery("from Emp").list();
//如果需要使用select查询时候定义别名时HQL不支持 select *
        /*List<Emp>  emps= session.createQuery("select e from Emp e").list();
        for(Emp emp :emps){
            System.out.println(emp.getEmpName()+" "+emp.getSalary());
        }*/
        //使用迭代器则会发送N条sql语句
        Query query  = session.createQuery("select e from Emp e");
        Iterator<Emp> emps2 = query.iterate();
        while(emps2.hasNext()){
           Emp  emp =   emps2.next();
           System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

注意:使用Iteration查询对象(普通属性除外)时发出N条语句进行查询,但如果缓存中存在数据默认情况下之下只会发送一条ID语句就不会发出其他查询语句。而list查询无论缓存是否存在数据,默认情况下多汁荟发出查询的语句。

条件查询
方式一
通过占位符方式:setParmeter

public  void testQueryEmp3(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query query = session.createQuery("from Emp where empName like ?");
        query.setParameter(0, "%张%");
        List<Emp> emps = query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();

方式二
通过重新命名来替代占位符

public  void testQueryEmp3(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query query = session.createQuery("from Emp where empName like :name");
        List<Emp> emps = query.setParameter("name", "%张%").list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();

方式三
多参数的赋值

public  void testQueryEmp3(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        List<Integer>  list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        Query  query = session.createQuery("from Emp where empNo in(:empNos)");
        query.setParameterList("empNos", list); //可以为 数组  也可以为集合
        List<Emp> emps= query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

外之命名查询
外置命名查询即把查询语句写在配置文件中
配置文件中:Emp.hdm.xml

  <query name="queryEmpByEmpNo">
      select e from Emp e where empNo =?
   </query>

Java代码:

public  void testQueryEmp4(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query query  = session.getNamedQuery("queryEmpByEmpNo");
        query.setParameter(0, 1);
        List<Emp> emps = query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

原生sql语句查询
Sql语句查询的字段要与数据库保持一致:createSQLQuery

    public  void testQueryEmp5(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query query = session.createSQLQuery("select * from emp where emp_Name like ?");
        query.setParameter(0, "%张%");
        List emps = query.list();
        for(int i=0; i<emps.size();i++){
        Object[]     obj = (Object[]) emps.get(i);
        System.out.println(Arrays.toString(obj));
        }
        session.close();
        factory.close();
    }

分页查询

public  void testQueryEmp6(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query query = session.createQuery("from Emp");
        query.setFirstResult(2);//起始位置
        query.setMaxResults(2);//每页显示条数
        // session.createQuery("from Emp").setFirstResult(2).setMaxResults(2).list;
        List<Emp> emps = query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

对象导航查询

    public  void testQueryEmp7(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query  query = session.createQuery("from Emp e where e.dept.deptNo=?");
        query.setParameter(0, "1001");
        List<Emp> emps = query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName());
        }
        session.close();
        factory.close();
    }

连接查询

public  void testQueryEmp8(){
        Configuration  cfg =    new Configuration().configure();
        SessionFactory  factory =   cfg.buildSessionFactory();
        Session session = factory.openSession();
        Transaction  tran = session.beginTransaction();
        Query  query = session.createQuery("select e from Emp e left join e.dept d where e.empName like ?");
//      Query  query = session.createQuery("select e from Emp e");
//      query.setParameter(0, "%张%"); s
        List<Emp> emps = query.list();
        for(Emp emp:emps){
            System.out.println(emp.getEmpName()+" "+emp.getDept().getDeptName());
        }
        session.close();
        factory.close();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值