zoukankan      html  css  js  c++  java
  • hibernate之HQL


    1. 什么是hql
    HQL是Hibernate Query Language的缩写

    查全部

    2. hql和sql区别/异同
    HQL                                                             SQL
    类名/属性                                                     表名/列名
    区分大小写,关键字不区分大小写                 不区分大小写
    别名                                                                别名
    ?,从下标0开始计算位置(hibernate5之后不支持) ?,       从顺序1开始计算位置
    :命名参数                          不支持:命名参数
    面向对象的查询语言                      面向结构查询语言

    hqlTest

    package com.zl5.test;
    
    import java.util.ArrayList;
    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.zl2.util.SessionFactoryUtils;
    import com.zl4.entity.Book;
    
    public class HqlTest {
    	private Session session;
    	private Transaction transaction;
    	
    	@Before
    	public void before() {
    		session = SessionFactoryUtils.openSession();
    		transaction = session.beginTransaction();
    	}
    	
    	@After
    	public void after() {
    		transaction.commit();
    		session.close();
    	}
    	
    	/**
    	 * 返回对象(多个)
    	 */
    	@Test
    	public void testList1() {
    		Query query = session.createQuery("from Book");
    		List<Book> list = query.list();
    		for (Book b : list) {
    			System.out.println(b);
    		}
    	}
    	
    	/**
    	 * 返回单个列段,用字符串就可以接受
    	 */
    	@Test
    	public void testList2() {
    		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【】
    	 */
    	@Test
    	public void testList3() {
    		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集合
    	 * sum
    	 * count
    	 */
    	@Test
    	public void testList4() {
    		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);
    		}
    	}
    	
    	/**
    	 * 查两个列段及以上,也可返回对象,前提是有对应的构造函数
    	 */
    	@Test
    	public void testList5() {
    		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语句支持占位符
    	 * query对象相当于preparestatement
    	 */
    	@Test
    	public void testList6() {
    //		Query query = session.createQuery("from Book where bookId = :bookId");
    //		query.setParameter("bookId", 1);
    //		Book b = (Book) query.getSingleResult();
    //		System.out.println(b);
    		
    		Query query = session.createQuery("from Book where bookId in (:bookIds)");
    //		query.setParameterList("bookIds", new Integer[] {1,2,4});
    		List<Integer> params = new ArrayList<Integer>();
    		params.add(1);
    		params.add(2);
    		params.add(4);
    		query.setParameterList("bookIds", params);
    		List<Book> list = query.list();
    		for (Book b : list) {
    			System.out.println(b);
    		}
    	}
    	
    	/**
    	 * HQL支持连接查询、
    	 * 
    	 * select * from t_hibernate_order o,t_hibernate_order_item oi where o.orderid =oi.oid and o.orderid=2
    	 */
    	@Test
    	public void testList7() {
    		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支持聚合函数
    	 * count
    	 * sum
    	 * avg
    	 */
    	@Test
    	public void testList8() {
    		Query query = session.createQuery("select count(*) from Book");
    		//getsingleresult,查询返回单行单列得数据
    		Long singleResult = (Long) query.getSingleResult();
    		System.out.println(singleResult);
    	}
    	
    	/**
    	 * sql=|select * from t_tibernate_book
    	 * sql+limt  start,offset
    	 * 1          0,10
    	 * 2		  10,10
    	 * 3          20,10
    	 * 
    	 * firetResult:代表起始下标 start
    	 * MaxResults:代表页大小offset
    	 * HQL分页
    	 * 
    	 */
    	@Test
    	public void testList9() {
    		Query query = session.createQuery("from Book");
    		query.setFirstResult(2);
    		query.setMaxResults(3);
    		List<Book> list = query.list();
    		for (Book b : list) {
    			System.out.println(b);
    		}
    	}
    }
    

      

    PageBean

    package com.zl5.util;
    
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    /**
     * 分页工具类
     *
     */
    public class PageBean {
    
    	private int page = 1;// 页码
    
    	private int rows = 3;// 页大小
    
    	private int total = 0;// 总记录数
    
    	private boolean pagination = true;// 是否分页
    	// 获取前台向后台提交的所有参数
    	private Map<String, String[]> parameterMap;
    	// 获取上一次访问后台的url
    	private String url;
    
    	/**
    	 * 初始化pagebean
    	 * 
    	 * @param req
    	 */
    	public void setRequest(HttpServletRequest req) {
    		this.setPage(req.getParameter("page"));
    		this.setRows(req.getParameter("rows"));
    		// 只有jsp页面上填写pagination=false才是不分页
    		this.setPagination(!"fasle".equals(req.getParameter("pagination")));
    		this.setParameterMap(req.getParameterMap());
    		this.setUrl(req.getRequestURL().toString());
    	}
    
    	public int getMaxPage() {
    		return this.total % this.rows == 0 ? this.total / this.rows : this.total / this.rows + 1;
    	}
    
    	public int nextPage() {
    		return this.page < this.getMaxPage() ? this.page + 1 : this.getMaxPage();
    	}
    
    	public int previousPage() {
    		return this.page > 1 ? this.page - 1 : 1;
    	}
    
    	public PageBean() {
    		super();
    	}
    
    	public int getPage() {
    		return page;
    	}
    
    	public void setPage(int page) {
    		this.page = page;
    	}
    
    	public void setPage(String page) {
    		this.page = StringUtils.isBlank(page) ? this.page : Integer.valueOf(page);
    	}
    
    	public int getRows() {
    		return rows;
    	}
    
    	public void setRows(int rows) {
    		this.rows = rows;
    	}
    
    	public void setRows(String rows) {
    		this.rows = StringUtils.isBlank(rows) ? this.rows : Integer.valueOf(rows);
    	}
    
    	public int getTotal() {
    		return total;
    	}
    
    	public void setTotal(int total) {
    		this.total = total;
    	}
    
    	public void setTotal(String total) {
    		this.total = Integer.parseInt(total);
    	}
    
    	public boolean isPagination() {
    		return pagination;
    	}
    
    	public void setPagination(boolean pagination) {
    		this.pagination = pagination;
    	}
    
    	public Map<String, String[]> getParameterMap() {
    		return parameterMap;
    	}
    
    	public void setParameterMap(Map<String, String[]> parameterMap) {
    		this.parameterMap = parameterMap;
    	}
    
    	public String getUrl() {
    		return url;
    	}
    
    	public void setUrl(String url) {
    		this.url = url;
    	}
    
    	/**
    	 * 获得起始记录的下标
    	 * 
    	 * @return
    	 */
    	public int getStartIndex() {
    		return (this.page - 1) * this.rows;
    	}
    
    	@Override
    	public String toString() {
    		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination
    				+ ", parameterMap=" + parameterMap + ", url=" + url + "]";
    	}
    
    }
    

      

    StringUtils

    package com.zl5.util;
    
    public class StringUtils {
    	// 私有的构造方法,保护此类不能在外部实例化
    	private StringUtils() {
    	}
    
    	/**
    	 * 如果字符串等于null或去空格后等于"",则返回true,否则返回false
    	 * 
    	 * @param s
    	 * @return
    	 */
    	public static boolean isBlank(String s) {
    		boolean b = false;
    		if (null == s || s.trim().equals("")) {
    			b = true;
    		}
    		return b;
    	}
    	
    	/**
    	 * 如果字符串不等于null或去空格后不等于"",则返回true,否则返回false
    	 * 
    	 * @param s
    	 * @return
    	 */
    	public static boolean isNotBlank(String s) {
    		return !isBlank(s);
    	}
    
    }
    

      

    BaseDao

    package com.zl5.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;
    
    /**
     * hibernate的通用查询dao层
     * 
     * 思想完全借鉴于sql的basedao
     * sql =select * from t_mvc_book where bname like '%圣墟%'
     * countsql=select count(1) from (sql) t;
     * pagesql =sql limit start,offset
     * 
     * 
     * hql:
     * hql=select * from Book where  bookName like :bookName
     * hql=from Book where bookName like :bookName
     * 思想:将原生态的hql语句以from关键字进行截取
     * counthql =select count(*) from Book where bookName like :bookName;
     * pagehql不需要写:因为hibernate已经封装了内置的分页接口
     * 			getFirstResult
     * 			getMaxResult
     * @author 2018111801
     *
     */
    public class BaseDao {
    	/**
    	 * 给hibernate中query对象中的命名参数列表赋值
    	 * @param query
    	 * @param map
    	 */
    	public void setparam(Query query,Map<String, Object> map) {
    		if(map!=null && map.size()>0) {
    			Set<Entry<String,Object>> entrySet = map.entrySet();
    			
    			for (Entry<String, Object> entry : entrySet) {
    				Object value = entry.getValue();
    				if(value instanceof Collection) 
    					query.setParameterList(entry.getKey(), (Collection)value);
    					else if(value instanceof Object[]) 
    						
    					
    					query.setParameterList(entry.getKey(), (Object[])value);
    					else
    					query.setParameter(entry.getKey(), value);	
    				
    				
    			
    		}
    		
    		
    	}
    	}
    	
    	/**
    	 *  hql:
    	 * hql=select * from Book where  bookName like :bookName
    	 * hql=from Book where bookName like :bookName
    	 * 思想:将原生态的hql语句以from关键字进行截取
    	 * counthql =select count(*) from Book where bookName like :bookName;
    	 * @param hql
    	 * @return
    	 */
    	public String getCountHql(String hql) {
    		return "select count(*)"+ hql.substring(hql.toUpperCase().indexOf("FROM"));
    	}
    	
    	/**
    	 * 通用hql语句查询
    	 * @param session  当前会话
    	 * @param hql		带命名参数的hql语句
    	 * @param map		命名参数对应的值的集合
    	 * @param pageBean	分页实体类
    	 * @return
    	 */
    	public List executeQuery(Session session,String hql,Map<String, Object> map,PageBean pageBean) {
    		List list=null;
    		Query query=null;
    		if(pageBean!=null&&pageBean.isPagination()) {
    			String countHql = getCountHql(hql);
    			Query createQuery = session.createQuery(countHql);
    			this.setparam(createQuery, map);
    			pageBean.setTotal(createQuery.getSingleResult().toString());
    			 query = session.createQuery(hql);
    				this.setparam(query, map);
    				query.setFirstResult(pageBean.getStartIndex());
    				query.setMaxResults(pageBean.getRows());
    				list=query.list();
    		}else {
    			 query = session.createQuery(hql);
    				this.setparam(query, map);
    			list=query.list();
    		}
    		return list;
    	}
    	
    	
    	
    	}
    

      

    接着BookDao继承 BaseDao 

    package com.zl4.dao;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.hibernate.Hibernate;
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.query.Query;
    
    import com.zl2.util.SessionFactoryUtils;
    import com.zl4.entity.Book;
    import com.zl4.entity.Category;
    import com.zl5.util.BaseDao;
    import com.zl5.util.PageBean;
    import com.zl5.util.StringUtils;
    
    
    public class BookDao  extends BaseDao{
    	public Integer addBook(Book book) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		Integer bid = (Integer) session.save(book);
    		transaction.commit();
    		session.close();
    		return bid;
    	}
    	
    	public Integer addCategory(Category category) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		Integer cid = (Integer) session.save(category);
    		transaction.commit();
    		session.close();
    		return cid;
    	}
    	
    	public Category getCategory(Category category) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		Category c = session.get(Category.class, category.getCategoryId());
    		transaction.commit();
    		session.close();
    		return c;
    	}
    	
    	public Book getBook(Book book) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		Book b = session.get(Book.class, book.getBookId());
    		if (b != null && new Integer(1).equals(book.getInitCategories())) {
    			Hibernate.initialize(b.getCategories());
    		}
    		transaction.commit();
    		session.close();
    		return b;
    	}
    	
    	public void delBook(Book book) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		session.delete(book);
    		transaction.commit();
    		session.close();
    	}
    	
    	public void delCategory(Category category) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		Category c = session.get(Category.class, category.getCategoryId());
    		if(c!=null) {
    			for (Book b : c.getBooks()) {
    //				通过在被控方通过主控方来解除关联关系,最后被控方再做删除
    				b.getCategories().remove(c);
    			}
    		}
    		session.delete(c);
    		transaction.commit();
    		session.close();
    	}
    	
    	/*********************通用查询*************************/
    	public List<Book> list1(Book book,PageBean pageBean) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		//下面代码处理得是book实体类得条件查询10*2
    		String bookName=book.getBookName();
    		//sql语句where后面可以直接写true,而hql与不能出现true
    		String hql="from Book where 1=1";
    		if(StringUtils.isNotBlank(bookName)) {
    			hql+=" and bookName like :bookname";
    			
    		}
    		Query query = session.createQuery(hql);
    		if(StringUtils.isNotBlank(bookName)) {
    			query.setParameter("bookName", bookName);
    	
    }
    		
    		//处理得是分页
    		if(pageBean!=null&&pageBean.isPagination()) {
    			query.setFirstResult(pageBean.getStartIndex());
    			query.setMaxResults(pageBean.getRows());
    		}
    		List list=query.list();
    		transaction.commit();
    		session.close();
    		return null;
    		
    		
    	}
    	
    	
    	public List<Book> list2(Book book,PageBean pageBean) {
    		Session session = SessionFactoryUtils.openSession();
    		Transaction transaction = session.beginTransaction();
    		//下面代码处理得是book实体类得条件查询10*2
    		String bookName=book.getBookName();
    		Map<String, Object> map=new HashMap<String, Object>();
    		//sql语句where后面可以直接写true,而hql与不能出现true
    		String hql="from Book where 1=1";
    		if(StringUtils.isNotBlank(bookName)) {
    			hql+=" and bookName like :bookname";
    			map.put("bookName", bookName);
    			
    		}
    		
    		List list=super.executeQuery(session, hql, map, pageBean);
    	
    		transaction.commit();
    		session.close();
    		return null;
    		
    		
    	}
    }
    

      

    在BookDaoTest测试

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/BAYOUA/p/11320049.html
Copyright © 2011-2022 走看看