经典JavaEE课程段鹏松第11章JPA的查询支持掌握JPA查询的基本流程掌握JPQL的基本语法了解在JPA中使用原生SQL查询课程目标概述•JPA定义了一套属于面向对象的查询语言:JavaPersistenceQueryLanguage(JPQL)•JPQL是面向对象的查询语言,因此它完全可以理解继承、多态和关联等特性。•JPQL内置了大量函数,极大地方便了数据库查询操作。目录•查询API•执行查询•JPQl语法•批量更新和批量删除•原生SQL查询面向对象的JPQL•SQL和JPQL最大的区别–SQL是面向数据库的查询语言–JPQL是面向对象的查询语言,类似HQL•JPQL的基本语法格式select实体别名.属性名,...from实体名[as]实体别名where实体别名.实体属性op比较值查询API简介•JPQL的查询主要由Query接口来完成•JPQL查询的步骤:–Query的创建•createQuery(StringJPQLString)•其他重载方法–Query设置查询参数•setParameter(...)•其他重载方法–Query执行查询•getResultList()•其他查询方法目录•查询API•执行查询•JPQl语法•批量更新和批量删除•原生SQL查询执行查询•位置参数:–?位置编号•命名参数:–:参数名•查询结果–一条记录,使用getSingleResult()–多条记录,使用getResultList()•实际操作演示简单示例(位置参数查询)Queryquery=em.createQuery(selectpfromFlentitypwherep.f_name=?1);query.setParameter(1,A1);returnquery.getResultList();简单示例(命名参数查询)Queryquery=em.createQuery(selectpfromFlentitypwherep.f_name=:name);query.setParameter(“name”,A1);returnquery.getResultList();目录•查询API•执行查询•JPQl语法•批量更新和批量删除•原生SQL查询概述•经过前面的学习,已经掌握了JPQL的基本查询流程。•本小节主要讲述JPQL查询的细节,知识点较为零碎。使用from子句•from子句用于查询指定的实体,其后紧跟实体类的类名。常用的格式如下:–from实体类名[as]实体别名•尽量避免在from后跟多个实体类名•实际操作演示使用select子句•select子句用于选择指定的属性或之际选择某个实体。常用的格式如下:–select实体别名.实体属性1,实体别名.实体属性2......from......•如果select后有多个项,则查询出来的集合元素就是相应类型的数组。•实际操作演示查询中使用构造器•JPQL允许在查询中根据选出的属性来创建对象。常用的格式如下:–selectnewclassName(属性名1,属性名2,...)from...•必须存在相应的构造函数。•查询出来的集合元素就是相应类型的构造类型。•实际操作演示where子句和条件表达式•where子句用于筛选查询的结果,缩小查询的范围。常用的格式如下:–select实体别名.实体属性1,实体别名.实体属性2......from......where条件表达式•条件表达式中可以采用精确查找,也可以采用模糊查找。•常用的条件运算符都支持。•实际操作演示使用JPQL函数•JPQL内置了大量功能强大的函数,可以更有效的执行查询,设置查询结果。•JPQL的内置函数有:–字符串函数–数学函数–日期、时间函数•实际操作演示多态查询•当查询实体类时,不仅可以查询该实体类的全部实例,还会查询出该类的子类的全部实例。•必须具有继承关系。•实际操作演示关联和连接•JPQL查询除了支持对继承映射的实体进行多态查询之外,也支持对关联映射的实体进行多表连接查询。•这种多表连接查询既可以是隐式连接,也可以是显示连接。•实际操作演示使用orderby进行排序•查询返回的集合可以根据实体或符合属性的任何属性使用orderby进行排序。•还可以使用asc或desc关键字指定升序或降序的排序规则。•默认是升序规则。•实际操作演示聚集函数和分组•JPQL的聚集函数–avg–count–max–min–sum•返回聚集值的查询可以对实体类或组件的属性使用groupby进行分组。•实际操作演示结果集分页•分页指的是获取查询记录中指定范围的记录,在显示的时候非常有用。•JPQL中的Query接口中提供了如下两个方法进行分页控制:–setFirstResult:记录的开始位置–setMaxResult:返回记录的条数•实际操作演示子查询和命名查询•子查询:在一个查询中包含另外一个查询–例如:select属性名from实体类where属性名(selectavg(属性名2)from实体类2)•命名查询:在Annotation中定义JPQL查询语句。–@NamedQuery•name:命名查询的名称•query:查询语句–@NamedQueries•用法参考本页PPT注解•实际操作演示目录•查询API•执行查询•JPQl语法•批量更新和批量删除•原生SQL查询批量更新•批量更新使用update语句。–updateClassNameset...[wherewhere_conditions]•执行update方法返回的结果是记录个数。•实际操作演示批量删除•批量删除使用delete语句。–deleteClassName[wherewhere_conditions]•执行update方法返回的结果是记录个数。•实际操作演示目录•查询API•执行查询•JPQl语法•批量更新和批量删除•原生SQL查询概述•使用原生SQL查询的过程很简单,主要使用EntityManager的CreateNativeQuery(Stringsql)方法即可创建一个代表原生SQL查询的Query对象,接下来就可以利用该Query对象执行查询了。•实际操作演示结果集映射和实体查询•原生SQL查询的结果集,里面的每个元素,要么是数组,要么是List集合。•可以对查询结果集里面的元素映射成查询实体,或将查询结果映射为普通的数据列。•@SqlResultSetMapping•@SqlResultSetMappings•实际操作演示存储过程简介•存储过程通常有以下优点:–存储过程增强了SQL语言的功能和灵活性。–存储过程允许标准组件式编程。–存储过程能实现较快的执行速度。–存储过程能过减少网络流量。–存储过程可被作为一种安全机制来充分利用。存储过程简介•MySQL存储过程共有三种参数类型,IN,OUT,INOUT,形式如:–CREATEPROCEDURE([[IN|OUT|INOUT]参数名数据类型...])–IN输入参数:表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值。–OUT输出参数:该值可在存储过程内部被改变,并可返回。–INOUT输入输出参数:调用时指定,并且可被改变和返回。调用存储过程•JPQL允许通过Query来调用存储过程,调用存储过程相当于执行原生SQL查询。•格式如下–call存储过程名(?1,?2,...)•注意:–如果要给存储过程传参数,必须带编号–不要带大括弧•实际操作演示本章小结•学习了JPA的查询•学习了JPQL语言的基本用法•学习了批量修改和批量删除操作•注意各种不同查询的用法