1. 程式人生 > >命名查詢(一)

命名查詢(一)

命名查詢語句實在對映檔案中定義字串形式的查詢語句

單表命名查詢:

語法:

<hibernate-mapping>
    <class name="com.kgc.entity.Emp" table="emp">
    ……
    </class>
    <query name="findEmpByJob>
        <![CDATA[
            from Emp e where e.job=:job
        ]]>
     </query>
</hibenate-mapping>

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 //Emp實體類

package com.kgc.po;

import java.util.Date;

public class Emp implements java.io.Serializable {

	private static final long serialVersionUID = 586622974111340861L;
	private Short empno;
	private String ename;
	private String job;
	private Short mgr;
	private Date hiredate;
	private Double sal;
	private Double comm;
	public Emp(Short empno) {
		this.empno = empno;
	}

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

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

	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;
	}
	public Emp() {
	}

	public Emp(String ename,String job){
		this.ename = ename;
		this.job = job;
	}
}

//Emp.hbm.xml

<?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="com.kgc.po.Emp" table="EMP" lazy="true">
        <id name="empno" type="java.lang.Short">
            <column name="EMPNO" precision="4" scale="0" />
            <generator class="increment" />
        </id>
        <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>
   <query name="findByJob">
    	<![CDATA[
    	  from Emp e where e.job = :job
    	]]>
    </query> 
</hibernate-mapping>

 //hibernate事務

package com.kgc.common;

import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;

public class HibernateSessionFactory {

	private static Configuration cfg;
	private static SessionFactory sessionFactory;
	
	static{
		try {
			cfg = new Configuration().configure();
			sessionFactory= cfg.buildSessionFactory();
		} catch (HibernateException e) {
			//日誌
			throw new RuntimeException("hibernate初始化失敗",e);
		}
	}
	
	public static Session getSession(){
		//sessionFactory.openSession 不能確定兩個使用者能否拿到同一個會話
		/*getCurrentSession在建立會話時,將當前使用者執行緒繫結   ,避免兩個使用者拿到同一個會話
		 * 在事務環境中才能正常工作
		 */
		return sessionFactory.getCurrentSession();
		/**
		 * getCurrentSession在commit和rollback後自動釋放資源
		 * */
	}
}

//業務邏輯

package com.kgc.biz;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;


import com.kgc.common.HibernateSessionFactory;

import com.kgc.po.Emp;

public class EmpBiz {
	//查詢
	public void findByEmpJob1(){
		Session session= HibernateSessionFactory.getSession();
			try {
				
				session.beginTransaction();
				List<Emp> e = (List<Emp>) session.getNamedQuery("findByJob")
						.setString("job","CLERK").list();
				System.out.println("====================================");
				System.out.println("員工編號\t員工姓名");
				for (Emp emp : e) {
					System.out.println(emp.getEmpno()+"\t"+emp.getEname());
				}
				session.getTransaction().commit();
			}catch (HibernateException e) {
				e.printStackTrace();
				session.getTransaction().rollback();
			}
	}
	
}

// hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
	<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">SCOTT</property>
		<property name="connection.password">tiger</property>
		<!-- 輔助引數 -->
		<property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
		<property name="show_sql">true</property>
		<property name="format_sql">true</property>
		<!--當前會話的建立機制   每個執行緒,使用者得到屬於自己的會話 -->
		<property name="current_session_context_class">thread</property>
		<!-- 對映檔案 -->
		<mapping resource="com/kgc/po/Emp.hbm.xml"/>
	</session-factory>
</hibernate-configuration>

//test

package com.kgc.test;

import com.kgc.biz.EmpBiz;

public class EmpTest {
	
	public static void main(String[] args) {
		EmpBiz biz = new EmpBiz();
		biz.findByEmpJob1();
	}

}

//執行結果


Hibernate: 
    select
        emp0_.EMPNO as EMPNO0_,
        emp0_.ENAME as ENAME0_,
        emp0_.JOB as JOB0_,
        emp0_.MGR as MGR0_,
        emp0_.HIREDATE as HIREDATE0_,
        emp0_.SAL as SAL0_,
        emp0_.COMM as COMM0_ 
    from
        EMP emp0_ 
    where
        emp0_.JOB=?
====================================
員工編號	員工姓名
7369	SMITH
7876	ADAMS
7900	JAMES
7934	MILLER