Hibernate(十)HQL查询二

一、数据库的emp名和dept表

建立持久化类和配置文件,可以用MyEclipse直接生成

持久化类

package entity;

import java.util.Date;

public class Emp implements java.io.Serializable {

    // Fields

    private Short empno;
    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() {
    }

    /** minimal constructor */
    public Emp(Short empno) {
        this.empno = empno;
    }

    /** full constructor */
    public Emp(Short empno, Dept dept, String ename, String job, Short mgr,
            Date hiredate, Double sal, Double comm) {
        this.empno = empno;
        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;
    }

}

Emp持久化类

package entity;

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

public class Dept implements java.io.Serializable {

    // Fields

    private Byte deptno;
    private String dname;
    private String loc;
    private Set emps = new HashSet(0);

    // Constructors

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

    /** minimal constructor */
    public Dept(Byte deptno) {
        this.deptno = deptno;
    }

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

    // Property accessors

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

    public void setDeptno(Byte 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持久化类

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">

<hibernate-mapping>
    <class name="entity.Emp" table="EMP" schema="SCOTT">
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO" precision="4" scale="0" />
            <generator class="assigned" />
        </id>
        <many-to-one name="dept" class="entity.Dept" fetch="select">
            <column name="DEPTNO" precision="2" scale="0" />
        </many-to-one>
        <property name="ename" type="java.lang.String">
            <column name="ENAME" length="10" />
        </property>
        <property name="job" type="java.lang.String">
            <column name="JOB" length="9" />
        </property>
        <property name="mgr" type="java.lang.Short">
            <column name="MGR" precision="4" scale="0" />
        </property>
        <property name="hiredate" type="java.util.Date">
            <column name="HIREDATE" length="7" />
        </property>
        <property name="sal" type="java.lang.Double">
            <column name="SAL" precision="7" />
        </property>
        <property name="comm" type="java.lang.Double">
            <column name="COMM" precision="7" />
        </property>
    </class>
</hibernate-mapping>

Emp.hbm.xml

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">

<hibernate-mapping>
    <class name="entity.Dept" table="DEPT" schema="SCOTT">
        <id name="deptno" type="java.lang.Byte">
            <column name="DEPTNO" precision="2" scale="0" />
            <generator class="assigned" />
        </id>
        <property name="dname" type="java.lang.String">
            <column name="DNAME" length="14" />
        </property>
        <property name="loc" type="java.lang.String">
            <column name="LOC" length="13" />
        </property>
        <set name="emps" inverse="true">
            <key>
                <column name="DEPTNO" precision="2" scale="0" />
            </key>
            <one-to-many class="entity.Emp" />
        </set>
    </class>
</hibernate-mapping>

Dept.hbm.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">

<hibernate-configuration>

    <session-factory>
        <property name="dialect">
            org.hibernate.dialect.Oracle9Dialect
        </property>
        <property name="connection.url">
            jdbc:oracle:thin:@localhost:1521:orcl
        </property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.driver_class">
            oracle.jdbc.OracleDriver
        </property>

        <mapping resource="entity/Emp.hbm.xml" />
        <mapping resource="entity/Dept.hbm.xml" />

    </session-factory>

</hibernate-configuration>

hibernate.cfg.xml

二、Query接口分页实现

  • 根据结果获得总亡录数:
Querty query=session.createQuery("from Emp");
List list=query.list();
int count=list.size();
  • 计算总页数:
int totalPages=(count%pageSize==0)?(count/pageSize):(count/pageSize+1);
  • 实现分页:
query.setFirstResult((pageIndex-1)*pageSize); //开始记录数
query.setMaxResults(pageSize);//每页显示最大记录数
List resultList=query.list();  //每页显示的记录集合 

查询全部员工

/*
     * 查询员工表内容
     */
    public static void findEmp(){
        Session session=new Configuration().configure().buildSessionFactory().openSession();
        //查询员工表按入职日期升序排,日期相同按名字降序
        String hql=" from Emp e order by e.hiredate ,e.ename desc ";
        Query query=session.createQuery(hql);
        List<Emp> emps=query.list();
        for (Emp emp : emps) {
            System.out.println("员工编号:"+emp.getEmpno()+"\t姓名: "+emp.getEname()+"\t入职日期:"+emp.getHiredate()+"\t部门名称:"+emp.getDept().getDname());
        }

    }

分页查询

/*
     * 分页查询
     */
    public static void pageDisplay(){
        Session session=new Configuration().configure().buildSessionFactory().openSession();
        String hql="from Emp";
        //第几页
        int pageIndex=4;
        //每页显示记录数
        int pageSize=4;
        Query query=session.createQuery(hql);
        //起始记录数
        query.setFirstResult((pageIndex-1)*pageSize);
        //每页显示最多记录数
        query.setMaxResults(pageSize);
        List<Emp> emps=query.list();
        for (Emp emp : emps) {
            System.out.println("员工编号:"+emp.getEmpno()+"\t姓名: "+emp.getEname()+"\t入职日期:"+emp.getHiredate()+"\t部门名称:"+emp.getDept().getDname());
        }

    }

三、连接查询

部门表中有个40部门,员工表中没有人是40部门的,

首先向EMP表中插入一条没有部门的记录

insert into emp(empno,ename,job,hiredate,sal)values(8888,‘张三‘,‘业务员‘,sysdate,800);

3.1、查询部门的所有员工使用内连接

String hql="from Dept d inner join d.emps";

3.2、查询部门的所有员工使用左外连接

String hql="from Dept d left join d.emps";

3.3、查询部门的所有员工使用右外连接

String hql="from Dept d right join d.emps";
时间: 2024-12-13 08:23:25

Hibernate(十)HQL查询二的相关文章

Hibernate六 HQL查询

HQL查询一 介绍1.HQL:Hibernate Query Language,是一种完全面向对象的查询语言.使用Hibernate有多重查询方式可供选择:hibernate的HQL查询,也可以使用条件查询,甚至使用原生的SQL查询语句.Hibernate还提供了一种数据过滤功能,这些都用于删选目标数据.2.查询步骤:(1)获取Hibernate Session对象(2)编写HQL语句(3)以HQL语句为参数,调用Session的createQuery()方法创建查询对象(4)如果HQL语句包含

hibernate的hql查询语句

hibernate的hql查询语句 在这里通过定义了三个类,Special.Classroom.Student来做测试,Special与Classroom是一对多,Classroom与Student是一对多的关系,这里仅仅贴出这三个bean的属性代码: Special类: public class Special { private int id; private String name; private String type; private Set<Classroom> rooms; .

Hibernate学习笔记(十) — HQL查询

一.HQL的一对多查询 班级(1)->(多)学生 /** * 实现Classes与Student的内连接 * * SELECT c.*,s.* * from classes c INNER JOIN student s * where (c.cid=s.cid) */ @Test public void testInnerJoin(){ session = HibernateUtils.openSession(); Query query = session.createQuery("fr

Hibernate(九)HQL查询

一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查询方式:通过Criteria等接口和类进行是查询 本地SQL查询方式:使用原生的SQL语言进行查询 对象导航查询方式:通过已经加载的对象,导航到其关联对象 其中HQL和QBC是Hibernater提供的专业的查询方式 HQL查询方式为官方推荐的标准查询方式 二.HQL查询简述 HQL:Hiberna

Hibernate(十一)HQL查询

HQL:Hibernate Query Language HQL有几个特点: 与SQL相似,SQL中的语法基本上都可以直接使用; SQL查询的是表和表中的列:HQL查询的是对象与对象中的属性; HQL的关键字不区分大小写,类名与属性名区分大小写; select可以省略. package test.hibernate.hbmHQL; import java.util.HashSet; import java.util.Set; public class Department { private I

hibernate之HQL查询

一.HQL简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,依赖于Query类,每个Query实例对应一个查询对象.查询步骤如下: 1)获取Hibernate Session对象 2)编写HQL语句 3)以HQL语句作为参数,调用session的createQuery()方法创建查询条件 4)如果HQL语句包含参数,则调用Query的setXxx()方法为参数赋值 5)调用Query对象的list()或uniqueResult()方法返回查询结果列表(持久

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射. 1 条件查询 1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename sql:select ename from emp where eage<? and esal >?; hql: select ename from Emp where eage<? and esal >? 1.2 问号的设置与别名 问号(?)的设置使用.setParameter(位置, 属性值)

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查询

这篇随笔将会记录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