Hibernate中Hql的查询

一 . Hibernate 查询语言(HQL)是一种面向对象的查询语言,类似于 SQL,但不是去对表和列进行操作,而是面向对象和它们的属性。 HQL 查询被 Hibernate 翻译为传统的 SQL 查询从而对数据库进行操作。

  1.简单的查询操作案例:

    1.1定义hibernate的主配置文件hibernate.cfg.xml

  

<?xml version=‘1.0‘ encoding=‘UTF-8‘?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>
    <!-- 配置sessionFactory,表示获取连接,包含连接的四要素
        注:hibernate 连接的四要素中的名字不能更改,必须是以下的名字
    -->
<session-factory>
    <!--方言   告诉hibernate,连接的是oracle数据库     -->
    <property name="dialect">
        org.hibernate.dialect.Oracle9Dialect
    </property>
    <property name="connection.url">
        jdbc:oracle:thin:local:1521:orcl
    </property>
    <property name="connection.username">scott</property>
    <property name="connection.password">tiger</property>
    <property name="connection.driver_class">
        oracle.jdbc.OracleDriver
    </property>
    <!-- 此标签用于是否在控制台输出sql语句  此处ture表示输出 -->
    <property name="show_sql">true</property>
    <!--此标签表示引入hiberante的映射文件 -->
    <mapping resource="cn/et/hibernate/lesson02/relation/Dept.hbm.xml" />
    <mapping resource="cn/et/hibernate/lesson02/relation/Emp.hbm.xml" />
</session-factory>

</hibernate-configuration>

  1.2 定义Hibernate的映射文件Dept.hbm.xml  ,Emp.hbm.xml

  

<!--此映射文件为Emp表的映射文件--><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.et.hibernate.lesson02.relation.Emp" table="EMP" schema="SCOTT">
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO" precision="4" scale="0" />
            <generator class="native" />
        </id>
        <!-- many-t-one 表示多对以的关系  Emp表对应Dept表示一对多的关系
            模拟查询语句:select * from emp where deptno="其中的一列"
         -->
        <many-to-one name="dept" class="cn.et.hibernate.lesson02.relation.Dept" fetch="select">
            <column name="DEPTNO" precision="3" scale="0">
                <comment>所属部门编号</comment>
            </column>
        </many-to-one>
        <property name="ename" type="java.lang.String">
            <column name="ENAME" length="10">
                <comment>员工姓名</comment>
            </column>
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB" length="9">
                <comment>员工职位</comment>
            </column>
        </property>
        <property name="mgr" type="java.lang.Short">
            <column name="MGR" precision="4" scale="0">
                <comment>领导编号</comment>
            </column>
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE" length="7">
                <comment>雇佣日期</comment>
            </column>
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL" precision="7">
                <comment>月薪</comment>
            </column>
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM" precision="7">
                <comment>奖金</comment>
            </column>
        </property>
    </class>
</hibernate-mapping>

  

<!--此映射文件为Dept表的映射文件--><?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="cn.et.hibernate.lesson02.relation.Dept" table="DEPT" schema="SCOTT">
        <id name="deptno" type="java.lang.Short">
            <column name="DEPTNO" precision="3" scale="0" />
            <generator class="native" />
        </id>
        <property name="dname" type="java.lang.String">
            <column name="DNAME" length="14">
                <comment>部门名称</comment>
            </column>
        </property>
        <property name="loc" type="java.lang.String">
            <column name="LOC" length="13">
                <comment>部门所在位置</comment>
            </column>
        </property>
        <!-- set 中的name 表示实体类中的集合名称  inverse="true" 表示控制反转的意思 -->
        <set name="emps" inverse="true">
            <!-- key 的意思表示将要查询表的主键   当做下一个表的查询条件-->
            <key>
                <column name="DEPTNO" precision="3" scale="0">
                </column>
            </key>
            <!-- 表示一对多的关系,Dept表对Emp表示一对多的关系-->
            <one-to-many class="cn.et.hibernate.lesson02.relation.Emp" />
        </set>
    </class>
</hibernate-mapping>

  1.3 创建Emp表 Dept表的实体类

  

//此表示Dept表的实体类package cn.et.hibernate.lesson02.relation;

import java.util.HashSet;
import java.util.Set;

/**
 * Dept entity. @author MyEclipse Persistence Tools
 */

public class Dept implements java.io.Serializable {

    // Fields

    private Short deptno;
    private String dname;
    private String loc;
    //set集合表示不可重复的
    private Set emps = new HashSet(0);

    // Constructors

    /** default constructor */
    public Dept() {
    }

    /** full constructor */
    public Dept(String dname, String loc, Set emps) {
        this.dname = dname;
        this.loc = loc;
        this.emps = emps;
    }

    // Property accessors

    public Short getDeptno() {
        return this.deptno;
    }

    public void setDeptno(Short deptno) {
        this.deptno = deptno;
    }

    public String getDname() {
        return this.dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public String getLoc() {
        return this.loc;
    }

    public void setLoc(String loc) {
        this.loc = loc;
    }

    public Set getEmps() {
        return this.emps;
    }

    public void setEmps(Set emps) {
        this.emps = emps;
    }

}
//此表示Dept表的实体类package cn.et.hibernate.lesson02.relation;

import java.util.Date;

/**
 * Emp entity. @author MyEclipse Persistence Tools
 */

public class Emp implements java.io.Serializable {

    // Fields

    private Short empno;
    //有一个Dept对象
    private Dept dept;
    private String ename;
    private String job;
    private Short mgr;
    private Date hiredate;
    private Double sal;
    private Double comm;

    // Constructors

    /** default constructor */
    public Emp() {
    }

    /** full constructor */
    public Emp(Dept dept, String ename, String job, Short mgr, Date hiredate,
            Double sal, Double comm) {
        this.dept = dept;
        this.ename = ename;
        this.job = job;
        this.mgr = mgr;
        this.hiredate = hiredate;
        this.sal = sal;
        this.comm = comm;
    }

    // Property accessors

    public Short getEmpno() {
        return this.empno;
    }

    public void setEmpno(Short empno) {
        this.empno = empno;
    }

    public Dept getDept() {
        return this.dept;
    }

    public void setDept(Dept dept) {
        this.dept = dept;
    }

    public String getEname() {
        return this.ename;
    }

    public void setEname(String ename) {
        this.ename = ename;
    }

    public String getJob() {
        return this.job;
    }

    public void setJob(String job) {
        this.job = job;
    }

    public Short getMgr() {
        return this.mgr;
    }

    public void setMgr(Short mgr) {
        this.mgr = mgr;
    }

    public Date getHiredate() {
        return this.hiredate;
    }

    public void setHiredate(Date hiredate) {
        this.hiredate = hiredate;
    }

    public Double getSal() {
        return this.sal;
    }

    public void setSal(Double sal) {
        this.sal = sal;
    }

    public Double getComm() {
        return this.comm;
    }

    public void setComm(Double comm) {
        this.comm = comm;
    }

}

  1.4 创建测试类,此测试类中有几种测试方法,注意区别

package cn.et.hibernate.lesson02.hsql;

import java.math.BigDecimal;
import java.util.Iterator;
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;
import org.junit.Test;

import cn.et.hibernate.lesson02.relation.Dept;
import cn.et.hibernate.lesson02.relation.Emp;
//此测试类是通过hsql语句进行查询

public class TestHibernate {
    @Test
    //此方法是简单的查询Emp表中的所有数据,无条件限定
    public void test1(){
        //创建sessionFactory
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //表示产生hql语句的过程
        Query createQuery = session.createQuery("from Emp");
        //该查询语句返回的是个List集合
        List<Emp> querList = createQuery.list();
        Iterator it = querList.iterator();
        while (it.hasNext()) {
            Emp e = (Emp) it.next();
            System.out.println(e.getEname()+"   "+e.getJob());
        }
        System.out.println(querList.size());
    }

    @Test
    //此方法通过hql方法进行数据库的查询,通过where条件进行简单的查询
    public void hsqlTest(){
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //定义一条HSQL的查询语句 通过?号的方式进行传参
        //Query createQuery = session.createQuery("from Emp where ename=?");
        //设置查询参数的值,用?号传参,此处的设置参数的索引是从0开始
        //createQuery.setParameter(0, "ALLEN");

        //传参的第二种方式 通过冒号:进行传参
        Query createQuery = session.createQuery("from Emp where ename=:myEname");
        //设置参数,通过?号的方式进行传参
        createQuery.setParameter("myEname", "ALLEN");
        List<Emp> querList = createQuery.list();
        Iterator it = querList.iterator();
        while (it.hasNext()) {
            Emp e = (Emp) it.next();
            System.out.println(e.getEname()+"   "+e.getJob());
        }
        System.out.println(querList.size());
    }
    /*
     * 以上文Hibernate的两种传参方式
     *         ?是jdbc的传参方式,通过位置jdbc从1开始, hibernate是从0开始
     *         :是通过名称的传参方式,通过设置键值对的方式进行传参(建议使用名称进行传参)
     */
    @Test
    //此方法通过hql对象的方式进行查询,然后通过对象点的方式进行关联表的查询操作
    public void hsqlTest1(){
        SessionFactory sf = new Configuration().configure("/cn/et/hibernate/lesson02/hibernate.cfg.xml").buildSessionFactory();
        Session session = sf.openSession();
        //第一种:此处通过对象的方式进行传参(建议使用)
        Query createQuery = session.createQuery("from Dept where deptno=:myEname");
        //设置参数,通过?号的方式进行传参
        createQuery.setParameter("myEname",Short.parseShort("30"));
        List<Dept> querList = createQuery.list();
        Iterator it = querList.iterator();
        while (it.hasNext()) {
            Dept e = (Dept) it.next();
            System.out.println(e.getDname());
        }
        //打印集合的第一个元素与,通过对象点的方式,查询对映学生表中的数据有多少条
        System.out.println(querList.get(0).getEmps().size());

        /*//第二种方式 此处通过对象的方式进行传参
        Query createQuery = session.createQuery("from Emp e where e.dept.deptno=:myEname");
        //设置参数,通过?号的方式进行传参
        createQuery.setParameter("myEname",Short.parseShort("30"));
        List<Emp> querList = createQuery.list();
        Iterator it = querList.iterator();
        while (it.hasNext()) {
            Emp e = (Emp) it.next();
            System.out.println(e.getEname());
        }
        //打印集合的第一个元素与,通过对象点的方式,查询对映学生表中的数据有多少条
        System.out.println(querList.size());*/
    }
}
时间: 2024-10-10 06:51:36

Hibernate中Hql的查询的相关文章

Hibernate中使用子查询

子查询: 子查询是SQL语句中非常重要的功能特性,它可以在SQL语句中利用另外一条SQL语句的查询结果,在Hibernate中HQL查询同样对子查询功能提供了支持. 如下面代码所示: List list=session.createQuery("from Customer c where 1>(select count(o) from c.orders o)").list(); 上面的程序查询订单数超过1的所有客户,因此和上面子查询HQL语句对应的SQL语句为: Select *

分享知识-快乐自己:Hibernate 中Criteria Query查询详解

1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Criteria查询(Criteria Query),这种查询方式把查询条件封装为一个Criteria对象. 在实际应用中,使用Session的createCriteria()方法构建一个org.hibernate.Criteria实例,然后把具体的查询条件通过Criteria的add()方法加入到Cr

Hibernate中的条件查询完毕类

Hibernate中的条件查询有下面三个类完毕: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类

Hibernate中的条件查询完成类

Hibernate中的条件查询有以下三个类完成: 1.Criteria:代表一次查询 2.Criterion:代表一个查询条件 3.Restrictions:产生查询条件的工具类 Hibernate中的条件查询完成类

Hibernate中的QBC查询

QBC 查询方式(Query By Criteria) public void testQBCQuery1(){ Criteria criteria=session.createCriteria(Student.class); List<Student> studentList=criteria.list(); Iterator it=studentList.iterator(); while(it.hasNext()){ Student s=(Student)it.next(); Syste

Hibernate-ORM:11.Hibernate中的关联查询

------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客将讲述Hibernate中的关联查询,及其级联(cascade)操作,以及指定哪一方维护关联关系的(inverse) 一,讲述目录如下: 1.单向一对多:(增加一个区县及其它以下的对应街道) 2.单项一对多:(查询一个区县,以及它下面所有的对应街道) 3.单项多对一:(查询一个指定的街道,并同时展示出其对应的区县) 4.双向一对多(多对一):(值得注意:toString()套路不对容易引发错误Err

Hibernate中Hql查询

这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码: Special类: public class Special { private int id; private String name; private String type; private Set<Classro

(转)Hibernate中Hql查询

转自:http://www.cnblogs.com/AnswerTheQuestion/p/6512701.html 这篇随笔将会记录hql的常用的查询语句,为日后查看提供便利. 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码: Special类: public class Special { private int id; pr

Hibernate之HQL检索(查询)方式

HQL(Hibernate Query Language)是面向对象的查询语言,与SQL非常相似.在Hibernate中,HQL是使用最广泛的检索方式. 具有下面经常使用功能: (1)在查询语句中,能够设定各种条件 (2)支持检出对象的部分属性,就是SQL语句中不用*,而是查询我们想查询的对象 (3)支持连接查询 (4)支持分页查询 (5)支持子查询 (6)支持动态绑定參数 (7)支持分组查询,能够用having,group by (8)提供分组函数(内置聚集函数,sum(),count(),a