命名查詢(一)
阿新 • • 發佈:2018-11-15
命名查詢語句實在對映檔案中定義字串形式的查詢語句
單表命名查詢:
語法:
<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