zoukankan      html  css  js  c++  java
  • Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存、更新、查找数据。
    session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与Session有关
    Session由SessionFactory创建,是线程安全的Thread-Safe,可以让多个线程同时存取SessionFactory
    而不会有数据共享的问题 


    Hibernate中Session的解释 :http://blog.csdn.net/shrek_xu/article/details/740991
    Hibernate 笔记 HQL查询(一)单属性,多属性查询 : http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html

    1. hql的查询应用:

    hibernate的session.createQuery()方法是使用HQL语句查询对象的。

    hql:是查询对象的,例如:"from User",其中from不区分大小写,而User区分大小写,因为它是对象。是User类
    返回Query对象。
    执行这条语句后,Hibernate会根据配置文件中所配置的数据库适配器自动生成相应数据库的SQL语句。

    sql: select * from dept; from 后面是表名
    hql: form Dept; from 后面是

    可以对类起别名,有两种方法。
    hql: from Dept d
    hql:from Dept as d

    2. 查询表中单个属性
    sql: select ename from dept
    hql: select ename from Dept

    对属性也可以设置别名
    hql:select ename as from Dept
    as 必须加。

    3. 多属性查询

    sql: select ename,eage from emp
    hql: select ename,eage from Emp
    hql: select e.ename,e.eage from Emp e

    注意:对多个属性查询的时候,使用Obejct数组。

     //第三个查询:对多属性查询
    Query query3=session.createQuery("select ename,eage from Emp");    
    List<Object[]> list3 = query3.list(); 
    //对多个属性查询的时候,使用Obejct数组。
    for(Object[] message:list3){
        //采用辅助类Arrays的toString()方法打印数组。
        System.out.println(Arrays.toString(message));
    }  

    4. 通过实体类方式查询多属性

    除了上述方法外,还可以采用实体类的方式查询,要在Emp类中加入带有查询参数的构造器,代码如下。

    public class Emp {
       private int eid;
       private int eage;
       private float esal;
       private String ename;
       省略get,set方法。
    
    public Emp() {
        super();   
    }
    public Emp(int eage, String ename) {    //需要查询的属性是什么,构造器的参数就是什么。
        super();
        this.eage = eage;
        this.ename = ename;
    }

    查询代码:

    Query query=session.createQuery("select new Emp(eage,ename) from Emp e");    
    //select 后直接调用构造器,参数就是查询的属性,参数不可错乱。 List
    <Emp> list = query.list(); //此处不实用object数组,类类型即可 for(Emp message:list){ System.out.print("姓名:"+message.getEname()+" "); System.out.println("年龄:"+message.getEage()); }

    5.Criteria Query (功能和Query类似)

    Hibernate学习笔记--Criteria Query :http://demojava.iteye.com/blog/858342

    Criteria Query通过面向对象的设计,将数据查询条件封装为一个对象。

    简单来说,Criteria Query可以看作是传统SQL的对象化表示,如:

    //第五个查询
    Criteria criteria=session.createCriteria(Emp.class);
    criteria.add(Restrictions.like("did",1));
    criteria.add(Restrictions.eq("eage", 30));
    //相当于select eid,ename,eage from Emp where did=1 and eage=30
    List<Emp> list5=criteria.list();
    for(Emp em:list5){
        System.out.println(em.getEid()+" "+em.getEname()+em.getEage());
    }

    本质上是对"select eid,ename,eage from Emp where did=1 and eage=30"的封装。

    结果:1 乔峰 30

    ====

    例子: 

    建表

    在数据库ztest中建Dept表 在数据库ztest中建Emp表


    create table DEPT
    (
        DID Integer NOT NULL PRIMARY KEY, 
        DNAME VARCHAR(12),
        DADDRESS VARCHAR(12),
    )
    
    create table EMP
    (
        EID INTEGER NOT NULL PRIMARY KEY,
        ENAME VARCHAR(12),
        EAGE INTEGER,
        ESAL INTEGER,
        DID INTEGER,
    )
    
    insert into DEPT values(1,'业务部','address101')
    insert into DEPT values(2,'技术部','address201')
    insert into DEPT values(3,'管理部','address301')
    insert into DEPT values(4,'财务部','address401')
    insert into DEPT values(5,'人力资源部','address501')
    
    insert into EMP values(1,'乔峰',30,10000,1)
    insert into EMP values(2,'杨过',25,15020,2)
    insert into EMP values(3,'郭靖',33,23563,1)
    insert into EMP values(4,'周伯通',52,32000,3)
    insert into EMP values(5,'东方不败',43,12000,3)
    insert into EMP values(6,'任我行',44,16000,4)
    insert into EMP values(7,'任盈盈',30,22000,4)
    insert into EMP values(8,'李莫愁',42,45000,5)
    insert into EMP values(9,'令狐冲',35,20000,2)
    insert into EMP values(10,'岳不群',50,42000,2)

    进行查询

    package com.hibernate.hql;
    
    import java.util.Arrays;
    import java.util.List;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.cfg.Configuration;
    
    public class Test {
        public static void main(String[] args){
            try {
                Test1() ;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        public static void Test1() throws Exception{   
            Configuration config=new Configuration().configure();
            SessionFactory sessionFactory= config.buildSessionFactory();
            Session session=null;
            Transaction tr=null;
            try{
                session= sessionFactory.openSession();
                tr=session.beginTransaction();
    
                //第一个查询
                String hql="from Dept"; //定义String类型hql,写入hql语句。    
                Query query=session.createQuery(hql);                    
                List<Dept> list = query.list();                          
                
                for(Dept dept:list){                                     
                    System.out.print("部门编号:  "+dept.getDid() +"   "); 
                    System.out.println("部门名称:   "+dept.getDname());   
                }
                
                //第二个查询
                String hql2 = "from Emp where eid = 5";
                Query query2 = session.createQuery(hql2);
                List<Emp> list2 = query2.list();
                for(Emp emp:list2){
                    System.out.print("员工编号:"+emp.getEid());
                    System.out.println("员工姓名:"+emp.getEname());
                }
                
                //第三个查询:对多属性查询
                Query query3=session.createQuery("select ename,eage from Emp");    
                List<Object[]> list3 = query3.list(); 
                //对多个属性查询的时候,使用Obejct数组。
    
                for(Object[] message:list3){
                    //采用辅助类Arrays的toString()方法打印数组。
                    System.out.println(Arrays.toString(message));
                }                                      
                
                tr.commit();                                             
            }catch(Exception e){
                tr.rollback();
            }finally{
                if(session!=null){
                    session.close();
                }
                if(sessionFactory!=null){
                    sessionFactory.close();
                }
            }
        }
    }

      

  • 相关阅读:
    Azure 虚拟机诊断设置问题排查
    虚拟机压力测试延迟高的可能原因及 ILPIP 配置 / 查询脚本
    理解 Azure 平台中虚拟机的计算能力
    如何复制或导出托管磁盘
    理解托管磁盘的原理与优势
    Azure 托管镜像和非托管镜像对比
    如何将同一云服务下的虚拟机从经典部署模型迁移到 Azure Resource Manager
    如何将同一 VNET 下的虚拟机从经典部署模型迁移到 Azure Resource Manager
    如何将使用托管磁盘虚拟机的 OS 盘挂载到其他虚拟机上
    基于 Azure 托管磁盘配置高可用共享文件系统
  • 原文地址:https://www.cnblogs.com/gnivor/p/4328293.html
Copyright © 2011-2022 走看看