hibernate查询
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于hibernate查询内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在hibernate查询相关知识领域提供全面立体的资料补充。同时还包含 h6、hack、hadoop 的知识内容,欢迎查阅!
hibernate查询相关知识
-
hibernate查询方式学习记录OID查询 //根据id查询返回一个对象 User user = session.get(User.class,1); HQL查询 HQL查询是操作实体类对象,并不是操作数据库表 1.查询所有 //创建Query对象 Query query = session.creatQuery("from User"); //调用方法得到结果,结果是一个List集合 List<User> list = query.list(); //遍历 for(User user : list){ System.out.print(user.getName); } 2.条件查询 Query query = session.creatQuery("from User where uid=? and userName=?"); //设
-
Hibernate【查询详解、连接池、逆向工程】前言 在Hibernate的第二篇中只是简单地说了Hibernate的几种查询方式....到目前为止,我们都是使用一些简单的主键查询阿...使用HQL查询所有的数据....本博文主要讲解Hibernate的查询操作,连接池,逆向工程的知识点... get/load主键查询 由于主键查询这个方法用得比较多,于是Hibernate专门为我们封装了起来... get()立即查询 load()懒加载 对象导航查询 如果对象与对象之前存在一对多、多对一的关系的时候 在以前SQL查询的时候:我们如果想要得到当前对象与另一对象的关联关系的时候,就
-
从零打造在线网盘系统之Hibernate查询与更新技术本篇前言在前面两篇文章中我们基本会使用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(); &
-
Oracle:HQL:实用技术HQL:实用技术 一:使用HQL语句 Hibernate支持三种查询方式: (1.)HQL查询,Criteriac查询及原生SQL(Native SQL)查询。HQL(Hibernate Query Language,Hibernate查询语言)是一种面向对象的查询语言,其中没有表和字段的概念,只有类对象,属性的概念。 二:编写HQL语句 From子句 Select子句 Where子句 使用表达式 Order by 子句:示例:升序排序:from Emp order by hireDate salary desc; 执行HQL语句的步骤: 获取Session 对象 编写HQL语句 创建Query对象:Que
hibernate查询相关课程
-
揭秘PHP模糊查询技术 在大数据时代,在繁杂的信息中,在PHP的开发过程中,通过什么技术能像“剪枝蔓,立主脑”一样快速准确地查找客户想要的信息?这技术就是PHP模糊查询技术,本课程就从本质上揭密PHP模糊查询技术。
讲师:HappyLiu 初级 24281人正在学习
hibernate查询相关教程
- 2.2 高级查询 排序查询使用 order API 实现:criteria.addOrder(Order.desc("stuId"));criteria.addOrder(Order.asc("stuName"));一样,可以多字段排序。使用聚合函数:聚合函数的功能封装在 projections API 中:criteria.setProjection(Projections.rowCount());criteria.setProjection(Projections.avg("stuId"));criteria.setProjection(Projections.max("stuId"));criteria.setProjection(Projections.min("stuId"));criteria.setProjection(Projections.sum("stuId"));Criteria 也能实现关联查询:Criteria criteria = session.createCriteria(Student.class);criteria.add(Restrictions.like("stuName", "Hibernate%"));Criteria criteria01 = criteria.createCriteria("classRoom");criteria01.add(Restrictions.like("classRoomName", "c19%"));List<Student> students = criteria.list();可以把一个 Criteria 实例看成对一张表的查询,如果需要关联多张表,则可以通过一个 Criteria 再创建一个 Criteria 对象。Hibernate 为 Criteria 查询提供各种各样的 API,适应于任何查询需求,相比较使用的已经很普遍的 SQL 查询,Criteria 查询充满了鸡肋的味道。但对于动态查询需求,Criteria 查询的优势又很明显。
- 2. Criteria 查询 什么是 Criteria 查询?Criteria 查询从字面翻译就是标准查询。所谓 标准查询,指的是 HIbernate 提供了纯正的 OOP API 查询方案。不像 HQL 还掺杂了一些 SQL 层面的内容。来一个查询需求:查询所有的学生。想必这学生会很生气,总是被搬来搬去的。上实例之前,先认识 Hibernate 兄弟会中的一名新成员:Criteria。在使用 Criteria 查询之前,必须先创建 Criteria 对象:Criteria cr = session.createCriteria(Student.class);List<Student> stus = cr.list();是不是很 OOP。使用 HQL 时,会有一种时空穿越的感觉 ,OOP 和 SQL 语法交替出现,很容易犯晕。使用 Criteria 进行查询时则不会。而且,Criteria 不是一个人在战斗,它也有属于自己的兄弟会,为开发者提供了更强有力的支持。先介绍一下它的几个兄弟,并且它们的作用已经从字面告诉了你。Criterion: 这位兄弟长得好生面熟,其实它就 Criteria 的单数存在形式;Oder: 提供排序功能;Restrictions: 限制、约束的意思,和 SQL 中的 where 关键字的作用是一样。所以,它提供了很多类似于运算符的方法,可以对查询数据进行过滤。Criteria 面子上很 OOP ,但是无论你怎么逃,都是在 SQL 的手掌心,也就是说 Criteria 查询最终还是会被 Hibernate 转译成 SQL 语句。只要是使用关系型数据库,SQL 就是逃不掉的宿命。只是直接、间接使用的区别。所以,Criteria 查询中总会找到 SQL 的影子。
- 3. 原生 SQL 查询 Hibernate 支持原生 SQL 查询,对于熟悉并钟情于 SQL 语句的开发者来讲,是一个很大的福音。实例:String sql="select * from student";SQLQuery sqlQuery= session.createSQLQuery(sql);Hibernate 提供了一个与原生 SQL 有关的 SQLQuery 对象。SQLQuery 是 Query 的子类,可适应不同的原生 SQL 语句查询。
- 3. 查询缓存 是不是 list() 方法真的就不能使用缓存,而只是作为 iterator() 身后的兄弟。Hibernate 中提供的有查询缓存的概念。查询缓存只对 query.list() 方法起作用。查询缓存依赖于二级缓存,因此一定要打开二级缓存。而且,在默认情况下,查询缓存也是关闭的。
- 2.2 HQL 高级查询 强参数查询使用 SQL 查询时,可以指定查询条件,这个地球人都知道。HQL 中同样能使用条件查询:from Student s where s.stuId> 2在 HQL 中,如果查询条件中的数据需要通过参数传递,则会有两种方案:匿名方案,已经司空见惯,对不对;from Student s where s.stuId> ?命名参数方案。from Student s where s.stuId> :id参数名前面一定要有一个冒号 :id。完整实例献上:String hql="from Student s where s.stuId> :id";Query query=session.createQuery(hql);query.setInteger("id", 2);List<Student> stus= query.list();for (Student student : stus) { ystem.out.println(student);}return null;可自行查看控制台上的输出结果。强命名参数和 ? 占位符作用是一样的,但是,强命名参数可减少指定实参时的出错率。分页查询分页查询是很实用的查询机制。使用原生 SQL 分页查询时,需要自己构建查询 SQL 语句,不同的数据库中的分页查询语句编写也有差异性。Hibernate 通过其提供的分页查询功能很好地避开了这些问题。分页查询之前,先搞清楚几个与查询有关的参数:pageSize: 每一页大小;pageNum: 页码。假如数据库中有 20 行数据,分页查询时指定 pageSize 为 5,则每 5 条数据为一个逻辑页,总共有 4 页。如果要查询第 3 页数据,即 pageNum=3。则需要跳过去的记录数为:(pageNum-1)*pageSize=(3-1)*5=10 ,也就是从第 11 条数据开始查询。现在直接上实例代码:String hql = "from Student s order by stuId" ;Query query = session.createQuery(hql);int pageNum=3;int pageSize=5;int passNum=(pageNum-1)*pageSize;query.setFirstResult(passNum);query.setMaxResults(pageSize);List<Student> stus = query.list();for (Student student : stus) { System.out.println(student.getStuName()); }return null;HIbernate 会从第 11 条记录开始,查询出 5 条记录。针对不同的数据库系统,Hibernate 会给出最佳的 SQL 分页方案。联合查询程序中所需要的数据可不一定在同一张表中,往往都是在多张表中。原生 SQL 通过多表连接或子查询方式解决这个问题。使用 HQL 一样能表达出多表连接的意图。可能你会问:前面的一对一、一对多、多对多映射关联关系后,不就已经能够查询出多张表中的数据吗。如下面表数据:在学生类中采用立即查询策略:@ManyToOne(targetEntity = ClassRoom.class, cascade = CascadeType.REMOVE,fetch=FetchType.EAGER)@JoinColumn(name = "classRoomId")public ClassRoom getClassRoom() { return classRoom;}查询所有学生:String hql = "from Student s";Query query = session.createQuery(hql);List<Student> stus = query.list();System.out.println("-----------------------------");for (Student student : stus) {System.out.println("学生姓名:"+student.getStuName());System.out.println("班级名称: "+student.getClassRoom().getClassRoomName()); }return null;不要怀疑,结果一定是会出现的。但是,可以看到控制台输出了很多 SQL 语句。那是因为,Hibernate 会先查询出所有学生,然后根据班级 ID 再进入班级表进行查询,这就是 Hibernate 查询过程的 1+N 问题。可改成下面的关联查询方式:String hql = "select s.stuName,c.classRoomName from Student s,ClassRoom c where s.classRoom=c";Query query = session.createQuery(hql);List<Object[]> stus = query.list();System.out.println("-----------------------------");for (Object[] student : stus) { System.out.println("学生姓名:"+student[0]); System.out.println("班级名称: "+student[1]); }return null;控制台输入结果:Hibernate: select student0_.stuName as col_0_0_, classroom1_.classRoomName as col_1_0_ from Student student0_ cross join ClassRoom classroom1_ where student0_.classRoomId=classroom1_.classRoomIdHibernate 仅构建了一条 SQL 语句,直接查询出来了所有数据,看得出来,其性能要大于 1+N 方案。HQL 比想象中要简单,比你预期的功能要强大。有了它,再也不怕查询不到我们需要的数据。
- 2.1 基础查询 为了更好地理解它们,来一个实例:查询姓名叫 “Hibernate” 的学生。Criteria criteria = session.createCriteria(Student.class);Criterion criterion = Restrictions.eq("stuName", "Hibernate");criteria.add(criterion);Student student = (Student) criteria.uniqueResult();System.out.println(student);Criteria 查询封装了关系型数据库的概念,所以,一定要注意,使用方法进行数据过滤时,都是属性进行比较。确认查询出来的数据只有一条记录时,可以使用 uniqueResult() 方法。条件查询的关键是了解 Restrictions,它所提供的很多类似于逻辑运算符的方法:Restrictions.eq(): 相当于 =;Restrictions.not(Exprission.eq()) : 相当于 <>;Restrictions.le(): 相当于 <=;Restrictions.gt(): 相当于 >;Restrictions.ge(): 相当于 >=;Restrictions.lt(): 相当于 <;Restrictions.isnull(): 相当于 is null;Restrictions.isNotNull(): 相当于 is not null ;Restrictions.like(): 相当于 like;Restrictions.and(): 相当于 and;Restrictions.conjunction(): 相当于 and;Restrictions.or(): 相当于 or;Restrictions.disjunction() : 相当于 or;Restrictions.not(): 相当于 not;Restrictions.in(): 相当于 in;Restrictions.not(Restrictions.in()): 相当于 not in;Restrictions.between(): 相当于 between x and y;Restrictions.not(Restrictions…between()) : 相当于 not between x and y。如上方法,几乎涵盖了所有 SQL 条件运算符,任意组合上面方法,没有查询不出来的结果。如查询学生编号是 1 或 2 或 4 的学生。使用 SQL,则是:select * from student where stuId in (1,2,4)使用 Criteria 查询,则如下所示:Criterion criterion = Restrictions.in("stuId",new Integer[] {1,2,4} );criteria.add(criterion);如查询学生编号大于 2 且班级编号为 1 的学生。使用 SQL:select * from student where stuId>2 and classRommId=1如果使用 Criteria 查询,则先构建两个约束对象:Criterion criterion = Restrictions.gt("stuId", 2);Criterion criterion1 = Restrictions.eqOrIsNull("classRoom.classRoomId", 1);再把这两个约束作为参数,构建一条联合约束:LogicalExpression logicalExpression = Restrictions.and(criterion, criterion1);criteria.add(logicalExpression);LogicalExpression API 用来表示一个逻辑表达式。是 Criterion 的子类。比较原生 SQL 和 Criteria 查询,会发现原生 SQL 语句要简单很多,使用 Criteria 查询需要掌握很多 API,而且代码量也比较大,这也可能是 Criteria 查询得不到普及的原因吧。但是,Hibernate 既然推出了这种查询方案,想必也有它的考虑。比如说,创建动态查询语句,这点原生 SQL 或 HQL 都没有 Criteria 好。还是那句话,存在就是合理的。如果,你对原生 SQL 有情怀,Criteria 查询中也是可以用的。criteria.add( Restrictions.sqlRestriction("stuId>2 and clasRoomId=1"));注意,不要在 Sql 片段中使用 where 关键字。既然是原生 SQL,所以语句中是字段概念,而不是属性概念。前面讲解 HQL 时,提到了分页查询。Criteria 一样可以实现分页查询,和 HQL 中分页方法一样:Criteria criteria = session.createCriteria(Student.class);criteria.setFirstResult(1);criteria.setMaxResults(5);List results = criteria.list();
hibernate查询相关搜索
-
h1
h6
hack
hadoop
halt
hana
handler
hanging
hash
hashtable
haskell
hatch
hbase
hbuilder
hdfs
head
header
header php
headers
headerstyle