•JPQL语言,即 Java Persistence Query Language 的简称。JPQL是一种和SQL非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的SQL查询,从而屏蔽不同数据库的差异。
•JPQL语言的语句可以是select 语句、update语句或delete语句,它们都通过 Query接口封装执行
•Query接口封装了执行数据库查询的相关方法。调用EntityManager的createQuery、createNamedQuery及createNativeQuery方法可以获得查询对象,进而可调用Query接口的相关方法来执行查询操作。
•Query接口的主要方法
–intexecuteUpdate()
•用于执行update或delete语句。
–List getResultList()
•用于执行select语句并返回结果集实体列表。
–Object getSingleResult()
•用于执行只返回单个结果实体的select语句。
–Query setFirstResult(intstartPosition)
•用于设置从哪个实体记录开始返回查询结果。
–Query setMaxResults(intmaxResult)
•用于设置返回结果实体的最大数。与setFirstResult结合使用可实现分页查询。
–Query setFlushMode(FlushModeTypeflushMode)
•设置查询对象的Flush模式。参数可以取2个枚举值:FlushModeType.AUTO为自动更新数据库记录,FlushModeType.COMMIT为直到提交事务时才更新数据库记录。
–setHint(StringhintName,Object value)
•设置与查询对象相关的特定供应商参数或提示信息。参数名及其取值需要参考特定JPA实现库提供商的文档。如果第二个参数无效将抛出IllegalArgumentException异常。
–setParameter(intposition, Object value)
•为查询语句的指定位置参数赋值。Position指定参数序号,value为赋给参数的值。
–setParameter(int position, Date d, TemporalType type)
•为查询语句的指定位置参数赋Date值。Position指定参数序号,value为赋给参数的值,temporalType取TemporalType的枚举常量,包括DATE、TIME及TIMESTAMP三个,,用于将Java的Date型值临时转换为数据库支持的日期时间类型(java.sql.Date、java.sql.Time及java.sql.Timestamp)。
–setParameter(int position, Calendar c, TemporalType type)
•为查询语句的指定位置参数赋Calendar值。position指定参数序号,value为赋给参数的值,temporalType的含义及取舍同前。
–setParameter(String name, Object value)
•为查询语句的指定名称参数赋值。
–setParameter(String name, Date d, TemporalType type)
•为查询语句的指定名称参数赋Date值。用法同前。
–setParameter(String name, Calendar c, TemporalType type)
•为查询语句的指定名称参数设置Calendar值。name为参数名,其它同前。该方法调用时如果参数位置或参数名不正确,或者所赋的参数值类型不匹配,将抛出IllegalArgumentException异常。
•查询所有实体的 JPQL 查询字串很简单,例如:

selecto from Order o或  selecto from Order as o

•关键字 as 可以省去。

•标识符变量的命名规范与 Java标识符相同,且区分大小写。

•where子句用于指定查询条件,where跟条件表达式。例:

selecto from Orders o where o.id = 1

select o from Orders o whereo.id > 3 and o.confirm = 'true'

select o from Orders o where o.address.streetNumber >=123

•JPQL也支持包含参数的查询,例如:

selecto from Orders o where o.id = :myId

select o from Orders o whereo.id = :myId and o.customer = :customerName

注意:参数名前必须冠以冒号(:),执行查询前须使用Query.setParameter(name,value)方法给参数赋值。

•也可以不使用参数名而使用参数的序号,例如:

select o from Order o where o.id = ?1 and o.customer = ?2

–其中?1 代表第一个参数,?2 代表第一个参数。在执行查询之前需要使用重载方法Query.setParameter(pos,value) 提供参数值。

Query query = entityManager.createQuery( "select o from    Orders o where o.id = ?1 and o.customer = ?2" );

query.setParameter( 1, 2 );

query.setParameter( 2, "John" );

List orders = query.getResultList();

… …

•where条件表达式中可用的运算符基本上与SQL一致,包括:
–算术运算符:+- * /+(正)-(负)
–关系运算符:==<>>>=<<=between…andlikeinis null 等
–逻辑运算符: andor not
•下面是一些常见查询表达式示例:

// 以下语句查询Id介于100至200之间的订单。

selecto from Orders o where o.id between 100 and 200

// 以下语句查询国籍为的'US'、'CN'或'JP'的客户。

selectc from Customers c where c.county in ('US','CN','JP')

// 以下语句查询手机号以139开头的客户。%表示任意多个字符序列,包括0个。

selectc from Customers c where c.phone like '139%'

// 以下语句查询名字包含4个字符,且234位为ose的客户。_表示任意单个字符。

selectc from Customers c where c.lname like '_ose'

// 以下语句查询电话号码未知的客户。Null用于测试单值是否为空。

selectc from Customers c where c.phone is null

// 以下语句查询尚未输入订单项的订单。empty用于测试集合是否为空。

selecto from Orders o where o.orderItems is empty

•如果只须查询实体的部分属性而不需要返回整个实体。例如:

selecto.id, o.customerName, o.address.streetNumber from Order o order by o.id

•执行该查询返回的不再是Orders实体集合,而是一个对象数组的集合(Object[]),集合的每个成员为一个对象数组,可通过数组元素访问各个属性。

group by子句与聚合查询

•group by 子句用于对查询结果分组统计,通常需要使用聚合函数。常用的聚合函数主要有 AVG、SUM、COUNT、MAX、MIN 等,它们的含义与SQL相同。例如:

select max(o.id) from Orders o

•没有 groupby 子句的查询是基于整个实体类的,使用聚合函数将返回单个结果值,可以使用Query.getSingleResult()得到查询结果。例如:

Query query = entityManager.createQuery(

"select max(o.id) fromOrders o");

Object result = query.getSingleResult();

Long max = (Long)result;

… …

•Having 子句用于对groupby 分组设置约束条件,用法与where子句基本相同,不同是where子句作用于基表或视图,以便从中选择满足条件的记录;having子句则作用于分组,用于选择满足条件的组,其条件表达式中通常会使用聚合函数。
•例如,以下语句用于查询订购总数大于100的商家所售商品及数量:

select o.seller, o.goodId, sum(o.amount) from V_Orders o group by

o.seller, o.goodId having sum(o.amount) > 100

•having子句与where子句一样都可以使用参数。

关联查询

•在JPQL中,很多时候都是通过在实体类中配置实体关联的类属性来实现隐含的关联(join)查询。例如:

selecto from Orders o where o.address.streetNumber=2000

•上述JPQL语句编译成以下SQL时就会自动包含关联,默认为左关联。
•在某些情况下可能仍然需要对关联做精确的控制。为此,JPQL也支持和SQL中类似的关联语法。如:
–left out join / left join
–inner join
–left join / inner join fetch
–其中,leftjoin和leftout join等义,都是允许符合条件的右边表达式中的实体为空。

JPQL函数

•JPQL提供了以下一些内建函数,包括字符串处理函数、算术函数和日期函数。
•字符串处理函数主要有:
–concat(String s1, String s2):字符串合并/连接函数。
–substring(String s, intstart, intlength):取字串函数。
–trim([leading|trailing|both,][char c,] String s):从字符串中去掉首/尾指定的字符或空格。
–lower(String s):将字符串转换成小写形式。
–upper(String s):将字符串转换成大写形式。
–length(String s):求字符串的长度。
–locate(String s1, String s2[, intstart]):从第一个字符串中查找第二个字符串(子串)出现的位置。若未找到则返回0。
•算术函数主要有 abs、mod、sqrt、size等。Size用于求集合的元素个数。
•日期函数主要为三个,即current_date、current_time、current_timestamp,它们不需要参数,返回服务器上的当前日期、时间和时戳。

jpql和query接口相关推荐

  1. Hibernate中的核心接口query接口用法

    Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. Query接口的用法: 通过SessionFactory获得了sessio ...

  2. 面向对象回顾(构造函数、覆盖和重载、Query接口的list方法和iterate方法、面向对象的六原则一法则、反射、内部类)

    1. 什么是构造函数?什么是构造函数重载?什么是复制构造函数? 当新对象被创建的时候,构造函数会被调用. 每一个类都有构造函数. 在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一个 ...

  3. (2)hibernate HQL命名查询和Query接口的分页查询

    一  hql命名查询 hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的 ...

  4. java query接口_Query接口学习笔记

    在Hibernate3.0中废除了find()方法,取而代之的是Query接口 一.绑定参数 1.使用"?"指定参数 通过Query接口可以先设定查询参数,然后通过setXXX() ...

  5. java query接口_「软帝学院」Java零基础学习详解

    软帝学院笔记Day26 01DButils工具类的介绍个三个核心类 * A: DButils工具类的介绍个三个核心类 * a: 概述 * DBUtils是java编程中的数据库操作实用工具,小巧简单实 ...

  6. java uniqueresult_Hibernate之Query接口的uniqueResult()方法详解

    如果查询返回多个值用list()方法 public void testQuery(){ Configuration config = new Configuration().configure(); ...

  7. Hibernate之Query接口的uniqueResult 方法

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 如果查询 ...

  8. Hibernate之Query接口的uniqueResult()方法

    当确定返回的实例只有一个或者null时 用uniqueResult()方法 //查询学生数量Object o=se.createCriteria(Student.class).setProjectio ...

  9. hibernate学习之四——Query和Criteria接口

    Query 和 Criteria 接口是 Hibernate 的查询接口,用于向数据库查询对象以及控制执行查询的过程. Query 实例包装了一个 HQL(Hibernate Query Langua ...

最新文章

  1. 如何快将数据集划分为train、val(Python3代码模板)
  2. 人活系列Streetlights (秩)
  3. Git提示Please move or remove them before you switch branches.
  4. 廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数
  5. 解决“HTTP/1.1 405 Method not allowed”问题
  6. layui table 分页 序号始终从”1“开始解决方法
  7. 综合网上解决mysql 5.7保存emoji 失败问题
  8. java平台沙箱安全组件,安全-如何创建Java沙箱?
  9. easyui tree复选框是否打钩状态_原创深度:如何利用OpenVINO工具套件监控机器操作员情绪状态(一)...
  10. Python学习中的知识点小记录(廖雪峰)
  11. 真正解决:gpg --verify sig: 无法检查签名:找不到公钥
  12. java 渲染器_用Java实现一个光线追踪渲染器(下)
  13. C语言嵌入式系统编程修炼之键盘操作
  14. 关于U盘被写保护无法格式化的解决方法
  15. 环网交换机的主要作用是什么?
  16. 作业 - 加密解密和CA
  17. 第三周学习总结和心得
  18. 互联网:互联网进入下半场,这场赛怎么比?
  19. [网络安全自学篇] 九十一.阿里云搭建LNMP环境及实现PHP自定义网站IP访问 (1)
  20. 使用ASP.NET.MVC制作手机接收验证码

热门文章

  1. 一分钟RecyclerView转场动画实现(淡入/出、旋转、缩放等)
  2. hduoj 2015 ()
  3. 计算机毕设Python+Vue疫情医疗物资管理系统(程序+LW+部署)
  4. 数据结构_非递归遍历二叉树(C语言)
  5. 荣耀畅玩5A近期要有大动作,说出旅游梦想就能榜你实现
  6. 医疗器械国内注册相关法规(一)
  7. 两个世纪最近一次:一颗小行星近距离飞掠地球
  8. 字母哥36+15稳固第一 塔图姆18中2绿军失利
  9. core分析-间接的指针误操作
  10. 单链表——指定结点的前插和后插