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());
??}
?}
}
posted on 2013-03-14 14:49 moonfans 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/moonfans/archive/2013/03/14/2959349.html
總結
- 上一篇: WordPress Terillion
- 下一篇: centos eclipse 安装