hibernatehql:hibernate3学习笔记( 9)|Query及HQL

  举例代码如下:

packagecom.hb3.pack_01;
importjava.util.Iterator;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importcom.hb3.pack_01.model.User;
importcom.hb3.pack_01.model.UserBak;
publicBusinessService{
  publicvoid(Stringargs){
    Configurationconfig=Configuration.configure;
    SessionFactorysessionFactory=config.buildSessionFactory;   
    Sessionsession=sessionFactory.openSession;
    Queryquery=session.createQuery("fromcom.hb3.pack_01.model.Useruserorderbyuser.agedesc,user.name");//[fromUser]
    prUserInfo(query.list);
    query=session.createQuery("selectcom.hb3.pack_01.model.UserBak(user.name,user.age)fromUserasuser");
    Iterator<?>iterator=query.list.iterator;
    .out.prln("_namettname/age");
    while(iterator.hasNext){
      UserBakuserbak=(UserBak)iterator.next;
      .out.prln(userbak.getClz+"t"+userbak.getName+"/"+userbak.getAge);
    }
    query=session.createQuery("selectupper(user.name)fromUserasuserwhere(user.age/2>=?)and(user.ageisnotnull)"); 
    query.Integer(0,13);
    List<?>names=query.list;
    iterator= names.iterator;
    while(iterator.hasNext){
      .out.prln(iterator.next);
    }
    query=session.createQuery("selectuser.name,user.agefromUserasuserwhereuser.age>:minAge"); 
    query.Integer("minAge",25);
    names=query.list;
    iterator= names.iterator;
    while(iterator.hasNext){
      Objectobj=(Object)iterator.next;
      .out.prln(obj[0]+"t"+obj[1]);
    }
    query=session.getNamedQuery("com.hb3.pack_01.model.User.QueryUser"); 
    query.Integer("minAge",25);
    prUserInfo(query.list);
    Transactiontx=session.beginTransaction;
    query=session.createQuery("updateUserage=24wherename='chenyan'");
    query.executeUpdate;
    tx.commit;
    tx=session.beginTransaction;
    query=session.createQuery("deleteUserwherename='yaobin'");
    query.executeUpdate;
    tx.commit;
    session.close;
    sessionFactory.close;
  }
  publicvoidprUserInfo(List<?>users){
    Iterator<?>iterator=users.iterator;
    .out.prln("idtname/age");
    while(iterator.hasNext){
      Useruser=(User)iterator.next;
      .out.prln(user.getId+"t"+user.getName+"/"+user.getAge);
    }
  }
}


  修改User.hbm.xml文件;

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mappingPUBLIC
  "-//Hibernate/HibernateMappingDTD3.0//EN" 
  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
  <name="com.hb3.pack_01.model.User"table="user" 
    dynamic-insert="true" 
    dynamic-update="true"  
  >
    <idname="id"column="id"type="java.lang.Integer"unsaved-value="null">
      <generator="native"/>
    </id>
    <propertyname="name"column="name"type="java.lang.String"/>
    <propertyname="age"column="age"type="java.lang.Integer"/>
  </>
  <queryname="com.hb3.pack_01.model.User.QueryUser">
    <![CDATA[       
      fromUserasuserwhereuser.age> :minAge    
    ]]>
  </query>
</hibernate-mapping>


  新建UserBak类

packagecom.hb3.pack_01.model;
publicUserBak{
  privateStringclz="UserBak";
  privateStringname;
  privateIntegerage;
  publicUserBak{
  }
  publicUserBak(Stringname,Integerage){
    this.name=name;
    this.age=age;
  }
  publicStringgetName{
    name;
  }
  publicvoidName(Stringname){
    this.name=name;
  }
  publicIntegergetAge{
    age;
  }
  publicvoidAge(Integerage){
    this.age=age;
  }
  publicStringgetClz{
    clz;
  }
  publicvoidClz(Stringclz){
    this.clz=clz;
  }
}


  运行结果:

16:53:02,015 WARN ConfigurationFactory:127 - No configuration found. Configuring ehcache from ehcache-failsafe.xml found in the path: jar:file:/D:/Java/MyEclipse%206.0/workspace/hb3demo/ehcache-1.2.3.jar!/ehcache-failsafe.xml
16:53:02,437 WARN EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.UpdateTimestampsCache]; using defaults.
16:53:02,468 WARN EhCacheProvider:93 - Could not find configuration [org.hibernate.cache.StandardQueryCache]; using defaults.
Hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.age as age0_ from user user0_ order by user0_.age desc, user0_.name
id  name/age
1  shenbin/28
2  chenyan/26
9  shenyi/23
10  yangye/23
11  chenyong/22
13  chendong/null
12  yaobin/null
Hibernate: select user0_.name as col_0_0_, user0_.age as col_1_0_ from user user0_
_name   name/age
UserBak  shenbin/28
UserBak  chenyan/26
UserBak  shenyi/23
UserBak  yangye/23
UserBak  chenyong/22
UserBak  yaobin/null
UserBak  chendong/null
Hibernate: select upper(user0_.name) as col_0_0_ from user user0_ where user0_.age/2>=? and (user0_.age is not null)
SHENBIN
CHENYAN
Hibernate: select user0_.name as col_0_0_, user0_.age as col_1_0_ from user user0_ where user0_.age>?
shenbin28
chenyan26
Hibernate: select user0_.id as id0_, user0_.name as name0_, user0_.age as age0_ from user user0_ where user0_.age>?
id  name/age
1  shenbin/28
2  chenyan/26
Hibernate: update user age=24 where name='chenyan'
Hibernate: delete from user where name='yaobin'


  注意点:

  1.在Hibernate3中可以直接使用HQL指定更新或刪除

  2.使用HQL可以自定义返回类型(如:UserBak)

  3.使用HQL可以结合各种查询条件使用where子句限定查询条件除了 = 运算的外还有 >、>=、<、<=、!= 或 <>等比较运算:

  Query query = session.createQuery("from User user where user.age between 20 and 30");

  Query query = session.createQuery("from User user where user.name in('caterpillar', 'momor')");

  Query query = session.createQuery("from User user where user.name like 'cater%'");

  Query query = session.createQuery("select avg(user.age) from User as user");

  Query query = session.createQuery("select count(*) from User as user");

  也可以配合GROUP BY子句假设在数据库表中追加个Sex字段

  Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex");

  运行结果可能是:

+-------------------------------+
|  sex    |  avg(age)  |
+-------------------------------+
|  male   |  30     |
+-------------------------------+
|  female  |  25     |
+-------------------------------+
  可以結合having子句,例如只将平均年龄大于20资料分组显示出来:

  Query query = session.createQuery("select user.sex, avg(user.age) from User user group by user.sex having avg(user.age) > 20");



  使用HQL是官方推荐查询方式



Tags:  hibernatehql查询 hibernatehql

延伸阅读

最新评论

发表评论