JPQL语句

JPQL语言

JPQL语言,即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言,它最终会被编译成针对不同底层数据库的 SQL 查询,从而屏蔽不同数据库的差异。

JPQL语言的语句可以是 select 语句、update 语句或delete语句,它们都通过 Query 接口封装执行。

 

Query接口封装了执行数据库查询的相关方法。调用 EntityManager 的 createQuery、create NamedQuery 及 createNativeQuery 方法可以获得查询对象,进而可调用 Query 接口的相关方法来执行查询操作。

 

Query接口的主要方法

int executeUpdate()

用于执行update或delete语句。

List getResultList()

用于执行select语句并返回结果集实体列表。

Object getSingleResult()

用于执行只返回单个结果实体的select语句。

Query setFirstResult(int startPosition)

用于设置从哪个实体记录开始返回查询结果。

Query setMaxResults(int maxResult)

用于设置返回结果实体的最大数。与setFirstResult结合使用可实现分页查询。

Query setFlushMode(FlushModeType flushMode)

设置查询对象的Flush模式。参数可以取2个枚举值:FlushModeType.AUTO 为自动更新数据库记录,FlushMode Type.COMMIT 为直到提交事务时才更新数据库记录。

setHint(String hintName, Object value)

设置与查询对象相关的特定供应商参数或提示信息。参数名及其取值需要参考特定 JPA 实现库提供商的文档。如果第二个参数无效将抛出IllegalArgumentException异常。

setParameter(int position, 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)

为查询语句的指定位置参数赋 Calenda r值。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 异常。

 

Select语句

select语句用于执行查询。其语法可表示为:

select_clause

form_clause

[where_clause]

[groupby_clause]

[having_clause]

[orderby_clause]

select-from 子句

from 子句是查询语句的必选子句。

Select 用来指定查询返回的结果实体或实体的某些属性

From 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。

如果不希望返回重复实体,可使用关键字 distinct 修饰。select、from 都是 JPQL 的关键字,通常全大写或全小写,建议不要大小写混用。

查询所有实体

查询所有实体的 JPQL 查询字串很简单,例如:

    select o from Order o 或  select o from Order as o

关键字 as 可以省去。

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

调用 EntityManager 的 createQuery() 方法可创建查询对象,接着调用 Query 接口的 getResultList() 方法就可获得查询结果集。例如:

Query query = entityManager.createQuery( "select o from Order o");

List orders = query.getResultList();

Iterator iterator = orders.iterator();

while( iterator.hasNext() ) {

    // 处理Order

}

Where子句

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

    select o from Orders o where o.id = 1

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

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

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

    select o from Orders o where o.id = :myId

    select o from Orders o where o.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…and like in is null 等

逻辑运下面是一些常见查询表达式示例:

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

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

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

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

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

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

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

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

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

select c from Customers c where c.phone is null

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

select o from Orders o where o.orderItems is empty算符: and or  not

 

查询部分属性

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

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

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

使用 Hibernate 的查询缓存

 

 

order by子句

order by子句用于对查询结果集进行排序。和SQL的用法类似,可以用 “asc“ 和 "desc“ 指定升降序。如果不显式注明,默认为升序。

select o from Orders o order by o.id

select o from Orders o order by o.address.streetNumber desc

select o from Orders o order by o.customer asc, o.id desc

group by子句与聚合查询

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

select max(o.id) from Orders o

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

Query query = entityManager.createQuery(

                  "select max(o.id) from Orders o");

Object result = query.getSingleResult();

Long max = (Long)result;

Having子句

Having 子句用于对 group by 分组设置约束条件,用法与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)查询。例如:

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

上述JPQL语句编译成以下SQL时就会自动包含关联,默认为左关联。

在某些情况下可能仍然需要对关联做精确的控制。为此,JPQL 也支持和 SQL 中类似的关联语法。如:

left out join / left join

inner join

left join / inner join fetch

其中,left join和left out join等义,都是允许符合条件的右边表达式中的实体为空。

例如,以下外关联查询可以找出所有客户实体记录,即使它未曾订货:

select c from Customers c left join c.orders o

以下内关联查询只找出所有曾订过商品的客户实体记录:

select c from Customers c inner join c.orders o

如果001号客户下过5次订单的话,以下fetch关联查询将得到 5个客户实体的引用,并且执行了 5 个订单的查询:

select c from Customers c left join fetch c.orders o where c.id=001

子查询

JPQL也支持子查询,在 where 或 having 子句中可以包含另一个查询。当子查询返回多于 1 个结果集时,它常出现在 any、all、exist s表达式中用于集合匹配查询。它们的用法与SQL语句基本相同。

JPQL函数

JPQL提供了以下一些内建函数,包括字符串处理函数、算术函数和日期函数。

字符串处理函数主要有:

concat(String s1, String s2):字符串合并/连接函数。

substring(String s, int start, int length):取字串函数。

trim([leading|trailing|both,] [char c,] String s):从字符串中去掉首/尾指定的字符或空格。

lower(String s):将字符串转换成小写形式。

upper(String s):将字符串转换成大写形式。

length(String s):求字符串的长度。

locate(String s1, String s2[, int start]):从第一个字符串中查找第二个字符串(子串)出现的位置。若未找到则返回0。

算术函数主要有 abs、mod、sqrt、size 等。Size 用于求集合的元素个数。

日期函数主要为三个,即 current_date、current_time、current_timestamp,它们不需要参数,返回服务器上的当前日期、时间和时戳。

 

UPDATE语句

update语句用于执行数据更新操作。主要用于针对单个实体类的批量更新

以下语句将帐户余额不足万元的客户状态设置为未偿付:

update Customers c set c.status = '未偿付' where c.balance <

10000

 

DELETE语句

delete语句用于执行数据更新操作。

以下语句删除不活跃的、没有订单的客户:

delete from Customers c where c.status =

'inactive' and c.orders is empty

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/143495.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

jpa之jpql查询

JPQL介绍 JPQL语言&#xff0c;即 Java Persistence Query Language 的简称。JPQL 是一种和 SQL 非常类似的中间性和对象化查询语言&#xff0c;它最终会被编译成针对不同底层数据库的 SQL 查询&#xff0c;从而屏蔽不同数据库的差异。如果会hibernate的hql查询&#xff0c;那…

JPA之JPQL

文章目录 什么是JPQL?JPQL怎么用&#xff1f;JPQL的查询demoJPQL的占位符与入参问题修改demo删除demo插入demo 什么是JPQL? 所谓JPQL&#xff0c;就是Java Persistence Query Language的缩写&#xff0c;也就是java持久化查询语言&#xff0e;JPQL是一种可移植的查询语言&am…

JPQL-Query查询实例详解

前面学习了JPQL语言和Query接口。这里学习一下如果通过JPQL和Query接口进行数据的查询、更新和删除。 【1】普通查询 首先说明一下FROM子句和Select…FROM。 from 子句是查询语句的必选子句。 Select 用来指定查询返回的结果实体或实体的某些属性。 From 子句声明查询源实体…

JPQL和SQL的比较

前言 在JAVA EE中&#xff0c;JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL)&#xff0c;java持久性查询语言。它是JPA规范的重要组成部分&#xff0c;其实它就是一种查询语言&#xff0c;语法类似于SQL语法&#xff0c;但是有着…

【JPQL】--JPQL和SQL的比较

前言 在JAVA EE中&#xff0c;JPQL是专门为Java 应用程序访问和导航实体实例设计的。Java Presistence Query Language(JPQL)&#xff0c;java持久性查询语言。它是JPA规范的重要组成部分&#xff0c;其实它就是一种查询语言&#xff0c;语法类似于SQL语法&#xff0c;但是有着…

JPQL

JPQL&#xff08;JavaPersistence Query Language&#xff09;&#xff0c;是基于实体的查询&#xff0c;所查询的内容都是实体或实体属性。 1、查询实体 SELECT c FROM Customer c JPQL语句与SQL基本类似&#xff0c;但它是基于实体的查询。在初次使用时&#xff0c;需要注…

JPQL查询

JPQL查询 1 jpql的介绍 sql&#xff1a;查询的是表和表中的字段。 jpql&#xff1a;查询的是实体类和类中的属性。 jpql和sql语句的语法相似。 JPQL全称Java Persistence Query Language 基于首次在EJB2.0中引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的…

JPQL详解

前提 最近在改bug的时候发现了自己的缺点&#xff0c;在改前端bug的时候非常顺利顺手。但是在改后端bug的时候如果遇到不是太难的问题还可以解决&#xff0c;但是一到难点感觉自己就懵逼&#xff01; 所以讲解了关于JPQl相关内容 JPA 在说jpql之前必须要说一下什么是JPA&…

JPA(4) JPQL一些简单的查询语法

JPQL --> JPA Query Language --> JPA的查询语句 (另外HQL:Hibernate的查询语句) JPQL本质&#xff1a;JPA通过antlr-2.7.7.jar将JPQL编译成sql并且封装执行的。 JPQL和SQL区别&#xff1f;&#xff1f; --> 它们查询的关键字都是一样的&#xff…

6月3号抖音显示服务器维护中,抖音搜索功能升级维护 期间无法进行用户搜索

这两天有很多小伙伴说抖音上的搜索功能搜不到人了&#xff0c;这是怎么回事呢&#xff1f;其实&#xff0c;这两天&#xff0c;抖音的搜索功能正在升级维护&#xff0c;所以导致搜索功能暂时无法使用。 类别&#xff1a;影音娱乐 大小&#xff1a;210.36M 语言&#xff1a…

java抖音获取用户信息失败_为什么抖音用id搜不到用户?抖音用id搜不到用户的原因与解决方法...

在抖音短视频上&#xff0c;网友可以通过抖音id来搜索指定的抖音用户&#xff0c;并添加为好友&#xff0c;不过&#xff0c;这几天&#xff0c;不断有网友反映一个问题&#xff0c;那就是&#xff1a;抖音用id搜不到用户&#xff0c;那么&#xff0c;为什么抖音用id搜不到用户…

【已解决】抖音如何取消关注已注销的账户

文章目录 1. 按2. 操作步骤 1. 按 我们有时候会发现自己的关注列表里有一些用户显示该用户已注销&#xff0c;这时我们想取消关注&#xff0c;但是却发现没有取消关注按钮&#xff0c;怎么办呢&#xff1f;其实我们可以记下这个账号的名字&#xff0c;然后到关注列表的最上方搜…

最近抖音上虚拟元宇宙项目-猜歌名,代码解析

介绍一下最近抖音上元宇宙虚拟项目猜歌名&#xff0c;直播游戏。用户互动猜歌名&#xff0c;30秒后自动切歌。 CSDN项目源码&#xff1a;https://download.csdn.net/download/u010978757/85326344 类似的弹幕互动游戏除了猜歌名&#xff0c;还有挤地铁、广场舞和舞厅蹦迪的&a…

抖音小店无货源是不是在割韭菜?

哈喽&#xff0c;大家好&#xff0c;我是布丁。 最近很多小伙伴私信布丁&#xff0c;问抖音小店无货源是不是在割韭菜? 今天布丁腾出了些时间&#xff0c;来和小伙伴们分享一下抖音小店无货源。希望能帮助小伙伴解决问题。 抖音小店 抖音小店依托抖音&#xff0c;所以会获得…

抖音快手短视频如何快速上热门

抖音快手短视频怎么上热门?这是许多抖友的一个烦恼! 抖音快手短视频怎么上热门?这也是许多都有的一个梦想! 抖音快手短视频怎么火&#xff0c;抖音快手短视频怎么上热门&#xff0c;相信玩抖音快手短视频的人都想知道其中的技巧。今天我们就把最详细的教程分享给大家。 下面分…

抖音小店无货源怎么做?具体步骤讲解,经验分享

哈喽&#xff0c;大家好&#xff0c;我是布丁。 废话不多说&#xff0c;直接上干货。 抖音小店无货源是什么&#xff1f; 抖音小店就是在抖音上开一家小店&#xff0c;抖音小店是一个电商平台&#xff0c;无货源是一种操作模式。 无货源模式就是在网上采集其他店铺的商品&a…

抖音快手短视频剪辑工具

新媒体短视频运营中短视频制作是较为重要的一环&#xff0c;而短视频制作时选择一款适合的短视频剪辑工具会达到事半功倍的效果&#xff0c;你的短视频需要深入用户内心&#xff0c;契合短视频自身的特色和要求&#xff0c;否则吐血写的脚本、拍完视频信心满满准备剪视频打开电…

抖音快手短视频平台营销技巧

随着碎片化的加剧&#xff0c;短视频平台依靠其时长短、数据流量的优势持续吸引大量用户。而今年的疫情危机&#xff0c;给社会带来了非常大的影响。在这次疫情中&#xff0c;在承担社会责任的同时&#xff0c;抖音快手短视频平台的逆转营销也是做得很成功&#xff0c;这种平台…

抖音快手短视频推广方式

之前的快手短视频主要集中在三四线城市以及农村等消费力不强的用户群体上&#xff0c;没能有力的抓住主流用户的眼光;如今在一二线城市大放异彩的抖音短视频让厂商们再也无法无视短视频对于用户的吸引力。有了短视频这一全新渠道&#xff0c;怎么更为有效的利用渠道成了各级厂商…

抖音短视频运营指南

最初在中国的视频分享应用程序刚刚在全球激增&#xff0c;成为了2019年全球青年最热的地方。而且&#xff0c;在人群中&#xff0c;品牌营销人员紧跟它的步伐。但是抖音并不是您常规的即插即用营销平台&#xff0c;因为它的用户具有很高的洞察力&#xff0c;任何感觉不到“真实…