HQL的使用详解

package com.inspur.test;

import java.util.Iterator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Expression;

import com.inspur.po.TAddress;
import com.inspur.po.TUser;

import junit.framework.TestCase;

public class HqlTest extends TestCase {
 Session session=null;

 @Override
 protected void setUp() throws Exception {
  Configuration config=new Configuration().configure();
  SessionFactory sessionFactory=config.buildSessionFactory();
  session=sessionFactory.openSession();
 }

 @Override
 protected void tearDown() throws Exception {
  session.close();
 }
 //目的是获得对象的部分属性,不用全部加载获取对象,可以只捕获其属性即可,
 //如果使用criteria则load上来的是全部的对象,从对象中在获得属性,增加了系统负担。
 public void testProperty(){
  String hql="select user.name from TUser user";
  List list=session.createQuery(hql).list();//返回的list中的每一个条目保存的是一个string类型的字符串而不是TUser类对象。
  Iterator it=list.iterator();
  while(it.hasNext()){
   System.out.println(it.next());
  }
  
 }
 //多属性的获取后返回的list中每一个条目保存是一个object[]类型的对象数组,
 //数组中的元素是对应hql中的属性的顺序
 public void testMulProperties(){
  String hql="select user.name,user.age from TUser user";
  List list=session.createQuery(hql).list();
  Iterator it=list.iterator();
  while(it.hasNext()){
   Object[]result=(Object[])it.next();
   System.out.println(result[0]+" "+result[1]);
  }
 }
 public void testCompute(){
  String hql="select count(*),min(user.age) from TUser user";
  List list=session.createQuery(hql).list();
  Iterator it=list.iterator();
  System.out.println("====test compute function====");
  while(it.hasNext()){
   Object[]result=(Object[])it.next();
   System.out.println(result[0]+" "+result[1] );
  }
 }
 public void testSave(){
  Transaction tran=null;
  TUser user=null;
  String hql="from TUser user where user.name='liuzhq'";
  Query query=session.createQuery(hql);
  List list=query.list();
  Iterator it=list.iterator();
  tran=session.beginTransaction();
  while(it.hasNext()){
   
   user=(TUser)it.next();
   user.setAge(24);
   session.save(user);
   tran.commit();
   System.out.println("save successfully");
   
  }
  
 }
// public void testSaveCriteria(){
//  Transaction tran=null;
//  tran=session.beginTransaction();
//  TUser user=null;
//  Criteria criteria=session.createCriteria(TUser.class);
//  criteria.add(Expression.eq("name", "liuzhq"));
//  List list=criteria.list();
//  Iterator it=list.iterator();
//  while(it.hasNext()){
//   user=(TUser)it.next();
//   user.setName("liuzhiqiang");
//   session.save(user);
//   tran.commit();
//   
//  }
//  
//  
// }
 public void testUpdate(){
  Transaction tran=null;
  tran=session.beginTransaction();
  String hql="update TUser user set user.age=18 where user.name='liuzhiqiang'";
  Query query=session.createQuery(hql);
  query.executeUpdate();
  tran.commit();
  
  
 }
// public void testDelete(){
//  Transaction tran=null;
//  tran=session.beginTransaction();
//  String hql="delete TUser user where user.age=18";
//  Query query=session.createQuery(hql);
//  query.executeUpdate();
//  tran.commit();
//  
// }
 //group by 和order by字句的使用,order by字句必须在整个hql语句的末尾,否则产出错误输出
 public void testGroup(){
  String hql="select user.age,count(*)from TUser user  group by user.age having count(*)>? order by user.age desc";
  Query query=session.createQuery(hql);
  query.setInteger(0, 1);
  List list=query.list();
  Iterator it=list.iterator();
  System.out.println("group by");
  while(it.hasNext()){
   Object[]result=(Object[])it.next();
   System.out.println(result[0]+" "+result[1]);
  }
 }
 //通过query接口进行参数填充,使用占位符相对于引用参数绑定和javabean参数绑定而言是最佳的参数绑定方式。
 public void testzhan(){
  String hql="from TUser user where user.name=? and user.age=?";
  Query query=session.createQuery(hql);
  query.setString(0, "liuzhiqiang");
  query.setInteger(1, 18);
  List list=query.list();
  Iterator it=list.iterator();
  while(it.hasNext()){
   TUser user=(TUser)it.next();
   System.out.println(user.getId());
  }
 }
 //外联查询中一定要添加fetch关键字否则生产的被动关联对象不会填充到主动关联对象的set中,只能
 //在返回的结果集中作为单独的对象存在,这样就不能通过主动对象访问到其关联的被动对象。
 //外联返回的list中包含条目是按照数据库中生成的记录数目相对应的,所有记录数生成对应的对象。
 public void testOutjoin(){
  TUser user=null;
  TAddress address=null;
  String hq1="from  TUser user left join fetch user.TAddresses";
  Query query=session.createQuery(hq1);
  List list=query.list();
  Iterator it=list.iterator();
  Iterator addit=null;
  while(it.hasNext()){
   user=(TUser)it.next();
   System.out.println(user.getName());
   System.out.println("=============");
   addit=user.getTAddresses().iterator();
   while(addit.hasNext()){
    address=(TAddress)addit.next();
    System.out.println(address.getAddress());
    
   }
   
   
  }
 }
 //不使用fetch关键字时返回的list中 的条目是TUser类对象和与其关联的被控对象TAddress类对象组成的object[]对象数组。
 public void testOutFetch(){
  TUser user=null;
  TAddress address=null;
  String hq1="from  TUser user left join  user.TAddresses";
  Query query=session.createQuery(hq1);
  List list=query.list();
  Iterator it=list.iterator();
  Iterator addit=null;
  while(it.hasNext()){
   Object[]result=(Object[])it.next();
   for(int i=0;i<result.length;i++){
    System.out.println(result[i]);
   }
   
   
   
  }
 }
 //测试子查询,hql中的子查询区别于sql中的子查询,如下所示为相关子查询。使用中要注意区别相关,非相关子查询。
 public void testSub(){
  String hql="from TUser user where (select count(*) from user.TAddresses)>1";
  Query query=session.createQuery(hql);
  List list=query.list();
  Iterator it=list.iterator();
  while(it.hasNext()){
   TUser user=(TUser)it.next();
   System.out.println(user.getName());
  }
 }

}

原文地址:https://www.cnblogs.com/moonfans/p/2959349.html