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