欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重地阐述SSH三个框架的基础知识,第四部分将会进入项目实战,如果您已经对SSH框架有所掌握,那么可以直接浏览第四章,源码均提供在GitHub/ssh-network-hard-disk上供大家参阅
本章学习目标
- 掌握标准查询API的使用
- 掌握QBE
- 掌握HQL
- 掌握SQL
本篇前言
在前面两篇文章中我们基本会使用Hibernate操作数据库,但是基本都是使用的是Session接口进行操作,像这种根据索引进行检索数据库局限性非常大.为此Hibernate提供了很强大的查询技术,例如标准查询API,QBE,HQL,SQL等
标准查询API
要想使用标准查询API就要用到Hibernate的org.hibernate.Criteria接口,通过Session.createCriteria既可以创建Criteria对象
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); criteria.setMaxResults(2); List list = criteria.list(); for (Object var : list) { System.out.print(var.toString()); } session.close(); }在使用标准API进行查询的时候增加约束条件是一个SimpleExpression对象,由org.hibernate.criterion.Restrictions类的静态方法可以获得相应的SimpleExpression对象.
criteria.add(Restrictions.eq("name", "中药"));我们同样可以进行模糊匹配
criteria.add(Restrictions.like("name", "%中%"));使用MatchMode类静态常量,模糊匹配我们也可以这样也是一样的
criteria.add(Restrictions.like("name", "中", MatchMode.ANYWHERE));在增加查询的约束条件的时候我们会这样使用,查询成绩大于90的学生并且是女生,或者怎么怎么样....,我们可以使用LogicalExpression改变他们的逻辑
public static void main(String[] args) { Session session = HibernateSessionFactory.getSession(); Criteria criteria = session.createCriteria(Product.class); SimpleExpression id1 = Restrictions.eq("id", 1); SimpleExpression id11 = Restrictions.eq("id", 11); LogicalExpression logicalExpression = Restrictions.or(id1, id11); criteria.add(logicalExpression); List list = criteria.list(); for (Object var : list) { System.out.print(var.toString()); } session.close(); }可以看到使用LogicalExpression逻辑变得非常臃肿,Hibernate提供了更便捷的解决方案,那就是使用Conjunction生成And关系,使用Disjunction生成or关系
Disjunction disjunction = Restrictions.disjunction(); disjunction.add(id1); disjunction.add(id11); criteria.add(disjunction); Conjunction conjunction = Restrictions.conjunction(); conjunction.add(id1); conjunction.add(id11); criteria.add(conjunction);那么如何使用标准查询API进行分页查询呢?得益于Hibernate对不同数据库的封装,我们可以很便捷地进行分页,例如xxxxx limit0, 10这样的SQL我们平时经常见到,我们可以使用Criteria接口两条语句即可实现分页功能
criteria.setFirstResult(0); criteria.setMaxResults(10);您阅读到这里的时候可以发现Criteria接口返回的都是List对象,如果我们知道一条索引id,我们根绝这个id去进行去进行查找,就没必要返回给我一个List集合了吧? 同样我们可以使用uniqueResult方法返回一个Object对象
