1. 程式人生 > >hibernate HQL 分頁 關聯查詢(一對多單向,多對一 雙向,多對多)

hibernate HQL 分頁 關聯查詢(一對多單向,多對一 雙向,多對多)

HQL的 分頁

1.首先我們準備好實體類:

package cn.happy.hibernate04pagelist;

import cn.happy.hibernate03hql.conEmp;

import java.util.Date;

/**
 * Created by linlin on 2017/9/25.
 */
public class Emp {
    private Long empno;
    private String empname;
    private String job;
    private Long mgr;
    private Date hiredate;
    private Long sal;
    private Long comm;
    private Byte deptno;



    public Long getEmpno() {
        return empno;
    }

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

    public String getEmpname() {
        return empname;
    }

    public void setEmpname(String empname) {
        this.empname = empname;
    }

    public String getJob() {
        return job;
    }

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

    public Long getMgr() {
        return mgr;
    }

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

    public Date getHiredate() {
        return hiredate;
    }

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

    public Long getSal() {
        return sal;
    }

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

    public Long getComm() {
        return comm;
    }

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

    public Byte getDeptno() {
        return deptno;
    }

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


然後是小配置:

<?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 package="cn.happy.hibernate03hql">
    <class name="cn.happy.hibernate04pagelist.Emp" table="EmpSLL">
        <id name="empno"  column="empno" >
            <generator class="native" />
        </id>
        <property name="empname" column="ENAME"/>
        <property name="job" column="job"/>
        <property name="mgr" column="mgr"/>
        <property name="hiredate" column="hiredate"/>
        <property name="sal" column="sal"/>
        <property name="comm" column="comm"/>
        <property name="deptno" column="deptno"/>
    </class>
        </hibernate-mapping>


大配置:

<?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="myeclipse.connection.profile">JDBC for MySQL</property>

        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>

        <property name="connection.url">jdbc:mysql://localhost:3306/book</property>

        <property name="connection.username">root</property>

        <property name="connection.password"></property>

        <property name="hibernate.show_sql">true</property>

        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.format_sql">true</property>
        <!–生成特定資料庫sql–>
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!–thread指定當前執行緒來跟蹤管理–>
        <property name="current_session_context_class">thread</property>


        <mapping resource="Dog.xml"></mapping>

    </session-factory>
-->

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

<property name="current_session_context_class">thread</property>
        <property name="show_sql">true</property>

<!--      <property name="hbm2ddl.auto">update</property>-->
        <property name="connection.autocommit">true</property>
     <!--   <mapping resource="cn/happy/hibernate01/Cat.hbm.xml"/>
        <mapping resource="cn/happy/hibernate02/Dept.hbm.xml"/>-->
     <!--   <mapping resource="cn/happy/hibernate03hql/Emp.hbm.xml"/>
        <mapping resource="cn/happy/hibernate04pagelist/Emp.hbm.xml"/>
        <mapping resource="cn/happy/hibernate06mapping/Emp.hbm.xml"/>
        <mapping resource="cn/happy/hibernate06mapping/Dept.hbm.xml"/>

        <mapping resource="cn/happy/hibernate07onttomany/Emp.hbm.xml"/>
        <mapping resource="cn/happy/hibernate07onttomany/Dept.hbm.xml"/>
-->
        <mapping resource="cn/happy/hibernate08save/Emp.hbm.xml"/>
        <mapping resource="cn/happy/hibernate08save/Dept.hbm.xml"/>

      <mapping resource="cn/happy/hibernate09manytomany/Employee.hbm.xml"/>
        <mapping resource="cn/happy/hibernate09manytomany/Project.hbm.xml"/>
    </session-factory>
</hibernate-configuration>


測試類:

    Configuration cfg;
    Transaction tx;
    Session session;
    SessionFactory factory;
    @Before
    public void myBefore(){
        //建立配置物件
        cfg = new Configuration().configure("Hibernate.cfg.xml");
        //根據配置物件建立SessionFactory
        factory = cfg.buildSessionFactory();
        //根據SessionFactory建立Session
        session= factory.openSession();
    /*    Session session1= HibernateUtil.getSession();
        System.out.println(session);
        System.out.println(session1);*/
        //在Session建立後開啟事務
        tx = session.beginTransaction();
    }

//分頁
    @Test
    public void testl8() {

        String hql="from Emp";
        Query query = session.createQuery(hql);
            int pageindex=2;
            int pagesize=3;
            query.setFirstResult((pageindex-1)*pagesize);
            query.setMaxResults(pagesize);
        List<Emp> list=query.list();
        for (Emp item:list){
            System.out.println(item.getEmpname());
        }
    }


一對一單向查詢:

實體 的關聯:封裝*****


並進行封裝(get  set)

然後是關聯小配置

<?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 package="cn.happy.hibernate06mapping">
    <class name="cn.happy.hibernate06mapping.Dept" table="Dept" schema="sll">
        <id name="deptno"  column="deptno" >
            <generator class="native" />
        </id>
        <property name="deptname" column="deptname"/>
    </class>


        </hibernate-mapping>

<?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 package="cn.happy.hibernate06mapping">
    <class name="cn.happy.hibernate06mapping.Emp" table="Emp" schema="sll">
        <id name="empno"  column="empno" >
            <generator class="native" />
        </id>
        <property name="enmae" column="enmae"/>

        <many-to-one name="dept" column="deptno"
                     class="cn.happy.hibernate06mapping.Dept"></many-to-one>
    </class>


        </hibernate-mapping>


大配置 如上述 一樣 新增一個mapping

測試類:

//多對一
    @Test
    public void testmanyToOne(){
        cn.happy.hibernate06mapping.Emp emp=session.get(cn.happy.hibernate06mapping.Emp.class,1);
        System.out.println(emp.getDept().getDeptname());
    }
多對多 查詢 帶有中間表:變像的 2個多對一



小配置:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.hibernate09manytomany">
    <class name="Employee" table="Employee22" schema="sll">
        <id name="empid" column="empid">
           <generator class="native"></generator>
        </id>
        <property name="empname" />
        <!--table指的是中間表-->
        <set name="projects" table="PROEMP22" inverse="true">
            <key column="REMPID"></key>
            <many-to-many column="RPROID" class="Project"></many-to-many>
        </set>
    </class>
</hibernate-mapping>

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.happy.hibernate09manytomany">
    <class name="Project" table="Project22" schema="sll">
        <id name="proid" column="proid">
           <generator class="native"></generator>
        </id>
        <property name="proname" />
    </class>
</hibernate-mapping>


測試類;

package cn.happy.test;


import cn.happy.hibernate08save.Dept;
import cn.happy.hibernate08save.Emp;
import cn.happy.hibernate09manytomany.Employee;
import cn.happy.hibernate09manytomany.Project;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Before;
import org.junit.Test;

import java.util.List;

/**
 * Created by linlin on 2017/9/22.
 */
public class test1006_02 {
    Configuration cfg;
    Transaction tx;
    Session session;
    SessionFactory factory;

    @Before
    public void myBefore() {
        //建立配置物件
        cfg = new Configuration().configure("Hibernate.cfg.xml");
        //根據配置物件建立SessionFactory
        factory = cfg.buildSessionFactory();
        //根據SessionFactory建立Session
        session = factory.openSession();
        //在Session建立後開啟事務
        tx = session.beginTransaction();
    }


    @Test
    public void test03() {
        Employee emp=session.get(Employee.class,1);
        System.out.println(emp.getEmpname());
        System.out.println("============");
        for(Project pro:emp.getProjects()){
            System.out.println(pro.getProname());
        }
    }


}