目录

  • 1.什么是hql
  • 2.hql和sql区别/异同
  • 3.案例

1.什么是hql

HQL是Hibernate Query Language的缩写

2.hql和sql区别/异同

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

3.案例

首先写一个测试类,来进行查询
HqlTest

package com.yinyi.five.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.yinyi.four.entity.Book;
import com.yinyi.two.util.SessionFactoryUtils;public class HqlTest {private Session session;private Transaction transaction;@Beforepublic void before() {session = SessionFactoryUtils.openSession();transaction = session.beginTransaction();}@Afterpublic void after() {transaction.commit();session.close();}/*** 返回对象(多个)*/@Testpublic void testList1() {Query query = session.createQuery(" from Book");List<Book> list = query.list();for (Book b : list) {System.out.println(b);}}/*** 返回单个列段,用字符串就可以接受*/@Testpublic 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【】*/@Testpublic 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集合*/@Testpublic 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);}}/*** 查两个列段及以上,也可返回对象,前提是有对应的构造函数*/@Testpublic 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语句支持占位符*/@Testpublic 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,7});
//      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支持连接查询*/@Testpublic void testList7() {//select * from t_hibernate_order o,t_hibernate_orider_item oi where o.order_id=oi.oidQuery 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支持聚合函数*/@Testpublic void testList8() {Query query = session.createQuery("select count(*) from Book");//getSingResult是用来获取单条记录的Long singleResult = (Long) query.getSingleResult();System.out.println(singleResult);}/*** HQL分页* * sql* * sql limit 5 ,5* * hql=select * from Book* *        同样的可以根据方言生成分页语句*            setFirstResult:设置其实下标*           setMaxResults:设置偏移量* * mysql:hql limit 5,5* hql limit 2 ,3* oracle* select *from (select tb.*, rownum rn hql t where t,rn>5)  t1  where  t1.rn<10* */@Testpublic 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);}}
}

BaseDao

package com.yinyi.five.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、分页代码重复问题* *  sql的通用分页的时候* getCountSql(sql)*          select count(1) from (sql) t* *             getCountHql(hql)*   hql= " from Book where bookName like :bookName"*     hql= "select * from new Book(bid,bookName) where bookName like :bookName"*   select count(1) hql* @author 20190614**/
public class BaseDao {/*** 通过的参数设置方法* @param map   参数键值对集合* @param query 预定义处理的hql对象*/public void setParam(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();//相当于例子中的hh,但是有时候它并不是单纯的字符串,可能是数组:比如爱好;也可能是集合if(value instanceof Object[]) {query.setParameter(entry.getKey(), (Object[])value);}else if(value instanceof Collection) {query.setParameter(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"int index = hql.toUpperCase().indexOf("FORM");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 createQuery = session.createQuery(countHql);this.setParam(map, createQuery);pageBean.setTotal(createQuery.getSingleResult().toString());Query query = session.createQuery(hql);//给预定义hql语句执行对象中的参数赋值,有多少赋值多少this.setParam(map, query);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;}
}

PageBean

package com.yinyi.five.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;// 获取上一次访问后台的urlprivate 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;}@Overridepublic String toString() {return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination+ ", parameterMap=" + parameterMap + ", url=" + url + "]";}}

StringUitls

package com.yinyi.five.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);}}

现在写dao方法

package com.yinyi.five.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、分页代码重复问题* *  sql的通用分页的时候* getCountSql(sql)*          select count(1) from (sql) t* *             getCountHql(hql)*   hql= " from Book where bookName like :bookName"*     hql= "select * from new Book(bid,bookName) where bookName like :bookName"*   select count(1) hql* @author 20190614**/
public class BaseDao {/*** 通过的参数设置方法* @param map   参数键值对集合* @param query 预定义处理的hql对象*/public void setParam(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();//相当于例子中的hh,但是有时候它并不是单纯的字符串,可能是数组:比如爱好;也可能是集合if(value instanceof Object[]) {query.setParameter(entry.getKey(), (Object[])value);}else if(value instanceof Collection) {query.setParameter(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"int index = hql.toUpperCase().indexOf("FORM");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 createQuery = session.createQuery(countHql);this.setParam(map, createQuery);pageBean.setTotal(createQuery.getSingleResult().toString());Query query = session.createQuery(hql);//给预定义hql语句执行对象中的参数赋值,有多少赋值多少this.setParam(map, query);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;}
}

BookDao

package com.yinyi.four.dao;import java.util.List;import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.Query;import com.yinyi.five.util.PageBean;
import com.yinyi.five.util.StringUtils;
import com.yinyi.four.entity.Book;
import com.yinyi.four.entity.Category;
import com.yinyi.two.util.SessionFactoryUtils;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();}/*** 需求:*       写一个带查询条件并且能分页方法* @param book* @param pageBean* @return*/public List<Book> list1(Book book,PageBean pageBean) {Session session = SessionFactoryUtils.openSession();Transaction transaction = session.beginTransaction();String bookName =book.getBookName(); String hql = "from Book where 1=1 ";if(StringUtils.isNotBlank(bookName)) {hql += " and bookName like :bookName";}//Query:相当于前面sql所用的prepareStatementQuery query = session.createQuery(hql);if(StringUtils.isNotBlank(bookName)) {query.setParameter("bookName", bookName);}//通过上述代码会发现,同样的if判断写了两次//下面这个代码每个实体类分页都得写if(pageBean != null && pageBean.isPagination()) {query.setFirstResult(pageBean.getStartIndex());query.setMaxResults(pageBean.getRows());}List<Book> list = query.list();System.out.println(list.size());transaction.commit();session.close();return list;}}

BookDaoTest开始调用

package com.yinyi.four.dao;import java.util.List;import org.junit.Test;import com.yinyi.five.util.PageBean;
import com.yinyi.four.entity.Book;
import com.yinyi.four.entity.Category;public class BookDaoTest {private BookDao bookDao = new BookDao();@Testpublic void testGetBook() {Book book = new Book();book.setBookId(1);book.setInitCategories(1);Book b = this.bookDao.getBook(book);System.out.println(b.getBookName());System.out.println(b.getCategories());}/*** book.hbm.xml inverse=fasle* category.hbm.xml inverse=true* 数据添加正常* 书籍表、桥接表各新增一条数据*/@Testpublic void test1() {Book book = new Book();book.setBookName("斗气化马");book.setPrice(10f);Category category = new Category();category.setCategoryId(5);
//      直接将category对象加入到新建的book中是错误的,因为此时的category是临时态的,hibernate是不会管理的
//      book.getCategories().add(category);Category c = this.bookDao.getCategory(category);//      c.getBooks().add(book);book.getCategories().add(c);this.bookDao.addBook(book);}/*** book.hbm.xml    inverse=false* category.hbm.xml inverse=true* 只增加书籍表数据* 桥接表不加数据* 原因:双方都没有去维护关系*/@Testpublic void test2() {Book book = new Book();book.setBookName("斗宗强者,恐怖如斯");book.setPrice(10f);Category category = new Category();category.setCategoryId(5);Category c = this.bookDao.getCategory(category);book.getCategories().add(c);this.bookDao.addBook(book);
//      c.getBooks().add(book);}/*** 测试*/@Testpublic void testList1() {Book book = new Book();PageBean pageBean = new PageBean();
//      pageBean.setPage(2);//查询第二页book.setBookName("%hh%");List<Book> list = this.bookDao.list1(book, pageBean);for (Book b : list) {System.out.println(b);}}@Testpublic void testList2() {Book book = new Book();PageBean pageBean = new PageBean();
//      pageBean.setPage(2);//查询第二页pageBean.setPagination(false);
//      book.setBookName("%aa%");List<Book> list = this.bookDao.list1(book, pageBean);for (Book b : list) {System.out.println(b);}}}

本次的分享就到此結束了,感謝您的觀看。

Hibernate之HQL相关推荐

  1. Hibernate中HQL函数汇总及其说明

    2019独角兽企业重金招聘Python工程师标准>>> Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lang ...

  2. Hibernate 笔记 HQL查询

    http://www.cnblogs.com/zilong882008/archive/2011/11/05/2237123.html Hibernate 笔记 HQL查询(一)单属性,多属性查询 H ...

  3. Hibernate的HQL中in参数设置和JdbcTemplete中的in参数

    写代码的时候突然忘记了,在此记录一下: Hibernate的HQL中in参数设置 public void updateDeviceByIDS(Long[] devicepkarr, DeviceINF ...

  4. java hql多条件查询_JSP 开发之hibernate的hql查询多对多查询

    JSP 开发之hibernate的hql查询多对多查询 在hibernate的hql查询中,假如说分组信息与试题是多对多关系,那么我们要在hql查询中对含有多个分组信息的试题都要查询出来.并同时查询出 ...

  5. 391、Java框架46 -【Hibernate - 查询HQL、查询Criteria、查询标准SQL】 2020.10.19

    0.目录 1.HQL 2.使用HQL,根据name进行模糊查询 3.查询Criteria 4.使用Criteria,根据name进行模糊查询 5.查询-标准SQL 6.使用标准SQL,根据name进行 ...

  6. 什么事java中hql语句,hibernate中hql语句详解

    之前给大家讲了一下hibernate分页查询的内容,那么下面就要接着给大家对hibernate中hql语句方面的知识进行一下详细的讲解,一起来了解一下吧. 刚开始做项目的时候,项目当中的hql语句就是 ...

  7. Hibernate(九)HQL查询

    一.Hibernate提供的查询方式 OID查询方式:主键查询.通过get()或者load()方法加载指定OID的对象查询结果为一个 HQL查询方式:通过Query接口使用HQL语言进行查询 QBC查 ...

  8. hibernate之HQL传中文参数乱码 解决办法

    在spring+hibernate中:Hql中有中文参数(如from test as c where c.name='张三')的话被翻译成sql的时候会出现乱码,解决办法是在application.x ...

  9. Hibernate之HQL数据库操作

    文件结构 1. 实体类 实例 Employee package com.bdqn.entity;import java.util.Date;public class Employee {private ...

  10. hibernate的HQL查询语言总结

    HQL是Hibernate Query Language的缩写,HQL的语法很像SQL的语法,但HQL是一种面向对象的查询语言.因此,SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类.实 ...

最新文章

  1. x86 cpu卷积网络的自动调谐
  2. 使用Java HttpURLConnection抓取网页内容(一)限制返回的网页大小
  3. R程序设计中的IF、IFELSE、SWITCH
  4. 皮一皮:有钱人的世界咱不懂之不知道第几次...
  5. mysql分库分表事务控制_数据库分库分表之后,你是如何解决事务问题?
  6. 关于Git你必须知道的
  7. 小程序 仿麦当劳_手机上的麦当劳和星巴克:为什么现在首先使用移动应用程序...
  8. Eclipse添加JDK源码
  9. MySQL8单表记录多少_mysql学习笔记之8(单表数据记录查询)_mysql
  10. Linux环境下Swap配置方法
  11. I00032 约瑟夫环(Joseph problem)
  12. 2020 计蒜之道 预赛 第一场 爆零记
  13. [picture_scrapy] 关于美女爬虫的一个集合
  14. 详解数论从入门到入土
  15. _stdcall相关
  16. 如何让搜狗快速收录网站的技巧和方法
  17. python爬取股票平均成本怎么算_用Python做股市数据分析(二)
  18. UVM重点归纳(一)
  19. 李宏毅ML笔记12:半监督
  20. 阿里P8整理Mysql面试题答案,助你面试“脱颖而出”

热门文章

  1. NY891 区间选点 找点
  2. CoreML遇到的问题和原因
  3. android canvas画图gc,自定义控件绘图(Canvas,Paint,Region等)篇一
  4. CE简单修改演示(植物大战僵尸)
  5. 如何修改cef源码支持windows xp
  6. 蒋晓海:Testin云测,如何让应用更有价值
  7. 走进Prime Time系列 - PT的Timing exception 03
  8. 前端历程(一)------初识前端
  9. 智能优化算法:遗传算法(GA)
  10. 尚硅谷Kubernetes(k8s)视频学习笔记