package com.hibernate.test;import java.util.Arrays;import java.util.List;import java.util.Map;import org.hibernate.Session;import org.hibernate.Transaction;import org.hibernate.query.Query;import org.junit.After;import org.junit.Before;import org.junit.Test;import com.hibernate.enetiy.Book;import com.hibernate.util.SessionFactoryUtils;publicclassHqlTest{private Session session;private Transaction transaction;@Beforepublicvoidbefore(){
session = SessionFactoryUtils.openSession();
transaction = session.beginTransaction();}@Afterpublicvoidafter(){
transaction.commit();
session.close();}/**
* 返回对象(多个)
* 查询所有
*/@TestpublicvoidtestList1(){
Query query = session.createQuery("from Book");
List<Book> list = query.list();for(Book b : list){
System.out.println(b);}}/**
* 返回单个列段,用字符串就可以接受
* 返回String类型 只查询书的名称
*/@TestpublicvoidtestList2(){
Query query = session.createQuery("select b.bookName as ss from Book b");
List<String> list = query.list();for(String b : list){
System.out.println(b);}}/**
* 查两个列段及以上,默认返回的是Object【】
* 查询两个列的数据
*
*/@TestpublicvoidtestList3(){
Query query = session.createQuery("select b.bookId,b.bookName as ss from Book b");
List<Object[]> list = query.list();for(Object[] b : list){
System.out.println(Arrays.toString(b));}}/**
* 注意map是函数,所以不区分大小写,返回的是map集合
* 用函数来查询多个列段,
*/@TestpublicvoidtestList4(){
Query query = session.createQuery("select new mAp(b.bookId,b.bookName) from Book b");
List<Map> list = query.list();for(Map b : list){
System.out.println(b);}}/**
* 查两个列段及以上,也可返回对象,前提是有对应的构造函数
*
*/@TestpublicvoidtestList5(){
Query query = session.createQuery("select new Book(b.bookId,b.bookName) from Book b");
List<Book> list = query.list();for(Book b : list){
System.out.println(b);}}/**
* HQL语句支持占位符
* 用变量名代替?
*/@TestpublicvoidtestList6(){
Query query = session.createQuery("from Book where bookId in (:bookIds)");
query.setParameterList("bookIds",newInteger[]{1,2,4});
List<Book> list = query.list();for(Book b : list){
System.out.println(b);}}/**
* HQL支持连接查询
*/@TestpublicvoidtestList7(){//select * from t_hibernate_order o,t_hinernate_item oi where o.order_id=oi.oid
Query query = session.createQuery("select o.orderNo,oi.quantity from Order o,OrderItem oi where o = oi.order");
List<Object[]> list = query.list();for(Object[] b : list){
System.out.println(Arrays.toString(b));}}/**
* HQL支持聚合函数
*/@TestpublicvoidtestList8(){//还支持 sum avg max min
Query query = session.createQuery("select count(*) from Book");//getSingleResult是用来获取单条记录的
Long singleResult =(Long) query.getSingleResult();
System.out.println(singleResult);}/**
* HQL分页
*
* 同样的可以自动根据方言生成分页语句
* oracle
* select * from (select t.*,rownum rn hql t where t.rn >5 ) t1 where
*/@TestpublicvoidtestList9(){
Query query = session.createQuery("from Book");//这是是开始位置 切记是从0开始滴
query.setFirstResult(1);//分页偏移量 就是一页展示几条数据
query.setMaxResults(3);
List<Book> list = query.list();for(Book b : list){
System.out.println(b);}}}
用HQL实现通用方法
BaseDao
package com.hibernate.util;import java.util.Collection;import java.util.List;import java.util.Map;import java.util.Map.Entry;import java.util.Set;import org.hibernate.Session;import org.hibernate.query.Query;/**
* 1、设置参数的问题
* 2、分页代码重的问题
*
* @author 林凡
*
*/publicclassBaseDao{/**
* 通用的参数设值方法
* @param map 参数键值对集合
* @param query 预定义处理的hql对象
*
*/privatevoidsetParam(Map<String,Object> map, Query query){if(map !=null && map.size()>0){
Object value =null;
Set<Entry<String, Object>> entrySet =map.entrySet();for(Entry<String, Object> entry : entrySet){//例子的西游记,但是有的时候它并不是单纯的字符串,可能是数组比如爱好,也可能是集合
value =entry.getValue();//判断类型,根据类型来设置命名参数的值if(value instanceofObject[]){
query.setParameterList(entry.getKey(),(Object[])value);}elseif(value instanceofCollection){
query.setParameterList(entry.getKey(),(Collection)value);}else{
query.setParameter(entry.getKey(),value);}}}}public String getCountHql(String hql){// * hql ="from Book where bookName like :bookName"// * hql ="select * from new Book(bid,bookName) where bookName like :bookName"//获取到FROM的位置int index = hql.toUpperCase().indexOf("FROM");//直接从FROM截断,将select count(*) 拼接上就ok了return"select count(*) "+hql.substring(index);}/**
* 通用查询方法
* @param session
* @param map
* @param hql
* @param pageBean
* @return
*/public List executeQuery(Session session,Map<String, Object> map,String hql,PageBean pageBean){
List list =null;if(pageBean !=null && pageBean.isPagination()){//获取该查询的总行数
String countHql =getCountHql(hql);
Query countQuery = session.createQuery(countHql);//给预定于的hql语句的命名参数赋值。有多少赋多少this.setParam(map, countQuery);//将总行数放入PageBean对象
pageBean.setTotal(countQuery.getSingleResult().toString());
Query query = session.createQuery(hql);//给预定于的hql语句的命名参数赋值。有多少赋多少this.setParam(map, query);//设置开始位置(下标从0开始)
query.setFirstResult(pageBean.getStartIndex());//这是偏移量,就是一页展示几条数据
query.setMaxResults(pageBean.getRows());
list = query.list();}else{
Query query = session.createQuery(hql);//给预定义hql语句执行对象中的参数赋值,有多少赋值多少this.setParam(map, query);
list =query.list();}return list;}}
publicclassBookDaoTest{private BookDao bookDao =newBookDao();@TestpublicvoidtestList1(){
Book book =newBook();
PageBean pageBean =newPageBean();// book.setBookName("%楼%");
List<Book> list =this.bookDao.list1(book, pageBean);for(Book b : list){
System.out.println(b);}}@TestpublicvoidtestList2(){
Book book =newBook();
PageBean pageBean =newPageBean();
pageBean.setPage(2);//设置从第三条开始查询(0为启始位置)
pageBean.setRows(3);//设置每页展示3条数据// pageBean.setPagination(false);// book.setBookName("%楼%");(like查询带楼字的书)
List<Book> list =this.bookDao.list12(book, pageBean);for(Book b : list){
System.out.println(b);}}}