熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Hibernate中HQL語句的使用

2013-11-23 20:18:03  來源: Java開源技術 

  本文主要使用一些測試方法來講解HQL的具體應用

  采用一對多的關系映射舉例兩個類Dept{diddnameemps}Emp{depteidename}

  Depthbmxml中

  [html]

  <hibernatemapping package=comtarenademopo>

  <class name=Dept table=t_dept>

  <id name=did column=did>

  <generator class=identity></generator>

  </id>

  <property name=dname></property>

  <set name=emps cascade=all inverse=true>

  <key column=did></key>

  <onetomany class=Emp/>

  </set>

  </class>

  </hibernatemapping>

  Emphbmxml中

  [html]

  <hibernatemapping package=comtarenademopo>

  <class name=Emp table=t_emp>

  <id name=eid column=eid>

  <generator class=identity></generator>

  </id>

  <property name=ename></property>

  <manytoone name=dept column=did class=Dept></manytoone>

  <query name=findEmpByEid>

  <![CDATA[

  from Emp where eid<?

  ]]>

  </query>

  </class>

  </hibernatemapping>

  測試類

  [java]

  public class TestHQL {

  /**

  * Hibernate生成關系模型

  */

  @Test

  public void testDDL(){

  Configuration cfg = new Configuration(nfigure();

  SchemaExport export = new SchemaExport(cfg);

  exportcreate(true true);

  }

  @Test

  public void testInitData(){

  //個部門個員工

  Session session = HibernateUtilsgetSession();

  for(int i=;i<=;i++){

  Dept dept = new Dept();

  deptsetDname(部門+i);

  Set<Emp> emps = new HashSet<Emp>();

  for(int j=;j<=;j++){

  Emp emp = new Emp();

  empsetEname(員工_+i+_+j);

  empsetDept(dept);

  empsadd(emp);

  }

  deptsetEmps(emps);

  sessionsave(dept);

  sessionclear();

  }

  sessionbeginTransaction(mit();

  HibernateUtilsclose(session);

  }

  /**

  * 查詢屬性

  * 查詢一個屬性集合中的數據類型為String(對於dname屬性)

  * 如果對於did屬性則是Integer類型

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select dname from Dept;

  Query query = sessioncreateQuery(hql);

  List<String> dnames = querylist();

  for (String dname : dnames) {

  Systemoutprintln(dname);

  }

  HibernateUtilsclose(session);

  }

  /**

  * 查詢多個屬性集合中數據的類型為Object[]

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select diddname from Dept;

  Query query = sessioncreateQuery(hql);

  List<Object[]> dnames = querylist();

  for (Object[] o : dnames) {

  Systemoutprintln(o[]+:+o[]);

  }

  HibernateUtilsclose(session);

  }

  /**

  * 查詢多個屬性動態構建一個對象Dept類必須要有new Dept(dnamedid)構造器

  * 和無參構造器

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select new Dept(diddname) from Dept;

  Query query = sessioncreateQuery(hql);

  List<Dept> depts = querylist();

  for(Dept dept:depts){

  Systemoutprintln(deptgetDname());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 簡單對象查詢

  * foreach迭代如果迭代一個空值如果從該對象獲得方法不會出現空指針異常

  * 內部采用的是iterator當ithasNext()才進行而如果是空值ithasNext()為false

  * 不會執行該對象的方法因此不會出現空指針異常

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select d from Dept d;

  Query query = sessioncreateQuery(hql);

  List<Dept> depts = querylist();

  for(Dept dept:depts){

  Systemoutprintln(deptgetDname()++deptgetDid());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 對象查詢條件查詢

  * 參數的順序從開始

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select d from Dept d where dname=?;

  Query query = sessioncreateQuery(hql);

  querysetString( 部門);

  List<Dept> depts = querylist();

  for (Dept dept : depts) {

  Systemoutprintln(deptgetDname());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 對象查詢條件查詢

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select d from Dept d where dname=? and did=?;

  List<Dept> depts = sessioncreateQuery(hql)

  setString( 部門)setInteger( )list();

  for (Dept dept : depts) {

  Systemoutprintln(deptgetDname());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 查詢所有員工信息

  * 分頁查詢

  * setFirstResult();確定查詢的起點

  * setMaxResult();確定查詢的條數

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = from Emp;

  int currentPage = ;

  int pageSize = ;

  List<Emp> emps = sessioncreateQuery(hql)

  setFirstResult((currentPage)*pageSize)

  setMaxResults(pageSize)list();

  for (Emp emp : emps) {

  Systemoutprintln(empgetEname());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 查詢所有員工信息

  * 查詢最大頁數

  * 首先查詢所有記錄數

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String hql = select count(*) from Emp;

  List<Long> list = sessioncreateQuery(hql)list();

  int rec = listget()intValue();

  int pageSize = ;

  Systemoutprintln(最大頁數為:);

  Systemoutprintln(rec%pageSize == ?rec/pageSize:rec/pageSize+);

  HibernateUtilsclose(session);

  }

  /**

  * 使用命名查詢

  * 將hql語句寫在映射文件中

  * 查詢ID號小於的員工信息

  * from Emp where eid<

  *  <query name=findEmpByEid>

  <![CDATA[

  from Emp where eid<?

  ]]>

  </query>

  getNamedQuery()獲取Query對象

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  Query query = sessiongetNamedQuery(findEmpByEid);

  querysetInteger( );

  List<Emp> emps = querylist();

  for (Emp emp : emps) {

  Systemoutprintln(empgetEid()+:+empgetEname());

  }

  HibernateUtilsclose(session);

  }

  /**

  * 在hibernate 中使用sql查詢

  * select * from t_emp;

  */

  @Test

  public void test(){

  Session session = HibernateUtilsgetSession();

  String sql = select * from t_emp;

  SQLQuery query = sessioncreateSQLQuery(sql);

  List<Object[]> list = querylist();

  for (Object[] o : list) { 

  Systemoutprintln(o[]+:+o[]+:+o[]);

  }

  HibernateUtilsclose(session);

  }

  }


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28256.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.