JPA支持两种表达查询的方法来检索实体和来自数据库的其他持久化数据:查询语句(Java Persistence Query Language,JPQL)和条件API(criteria API)。JPQL是独立于数据库的查询语句,其用于操作逻辑上的实体模型而非物理的数据模型。条件API是根据实体模型构建查询条件

1.Java持久化查询语句入门

List persons= entityManager.createQuery("select p from Person p").getResultList();

1.这个查询语句类似于SQL。但它与真正的SQL的区别是,它不是从一个表中进行选择查询,而是指定来自应用程序域模型的实体。

2.查询select子句也只是列出了查询实体的别名,如果只查询某一列的,可以使用点(.)操作符进行来导航实体属性。如下所示:

List persons= entityManager.createQuery("select p.firstName from Person p").getResultList();

1.1.筛选条件

像SQL一样,JPQL也支持where子句,用于对搜索的条件过滤。包括大多数的操作符,如:in,between、like以及函数表达式substring、length等等

List persons = entityManager.createQuery("select p from Person p where p.age>23").getResultList();

1.2.投影结果

对于查询的数据量比较大的话,可以使用投影的方式,只查询出有用的列。

//投影

List persons = entityManager.createQuery("select p.firstName,p.age from Person p").getResultList();

1.3.聚合查询

JPQL的聚合查询语法类似于SQL。例如count

List count=entityManager.createQuery("select count(p) from Person p").getResultList();

1.4.查询参数

JPQL支持两种类型的参数绑定语法。

1.位置参数表示法

其中参数是在查询字符串中指示,该字符串是在一个问号(?)之后紧随参数的编号。当执行查询的时候,开发人员指定应该替换的参数编

Query query=entityManager.createQuery("select p from Person p where p.age=?1 and p.firstName=?2");

query.setParameter(1,21);

query.setParameter(2,"Jack");

2.命名参数表示法

通过在一个冒号(:)之后紧随参数名称,在查询字符串对它进行指示,当执行查询的时候,开发人员指定应该替换的参数名称

Query query=entityManager.createQuery("select p from Person p where p.age=:age and p.firstName=:name");

query.setParameter("age",21);

query.setParameter("name","Jack");

2.定义查询

JPA提供Query和TypedQuery(JPA 2.0引入)接口来配置和执行查询。Query的返回的Object类型,而TypedQuery返回的是指定的Class类型。

//未指定类型,返回Object类型

Query q = entityManager.createQuery("select p from Person p");

//指定返回类型为Person类型

TypedQuery q1 = entityManager.createQuery("select p from Person p", Person.class);

2.1.动态查询定义

JPA查询引擎,可以将JPQL字符串解析成语法树,获取表达式中的实体对象-关系映射的元数据,然后生成等价的SQL。故有两种方式进行动态查询。

1.拼接字符串方式

Tip:会引起SQL注入问题

/**

* 动态拼接字符串构建查询条件

*

* @param name

* @param age

* @return

*/

public static String queryPersonJPQL(String name, int age) {

String queryQL = "select p from Person p where p.firstName= '" + name + "' and p.age=" + age;

return queryQL;

}

//调用

Query query = entityManager.createQuery(queryPersonJPQL("jack", 21));

2.动态参数化构建查询条件(推荐使用)

/**

* 动态参数化构建查询条件

*

* @return

*/

public static String queryPersonJPQLByParams() {

String queryQL = "select p from Person p where p.firstName=:name and p.age=:age";

return queryQL;

}

Query query = entityManager.createQuery(queryPersonJPQLByParams());

query.setParameter("name", "Jack");

query.setParameter("age", 21);

2.2.命名查询定义

命名查询是一个强大的工具。使用@NamedQuery注解定义一个命名查询,可以把它放在任何实体的类定义之上。该注解定义了查询的名称,及其查询的文本。

Tip:命名查询通畅放置在对应查询结果的实体类上

@Entity

@NamedQuery(name = "findByAge", query = "select p from Person p where p.age=:age")

public class Person {

//省略

}

Tip:NamedQuery里面定义的名称在整个持久化单元中需要唯一,不然运行会出错。

eg:

Exception in thread "main" org.hibernate.DuplicateMappingException: Duplicate query mapping findByAge

at org.hibernate.boot.internal.InFlightMetadataCollectorImpl.checkQueryName

调用

List people = entityManager.createNamedQuery("findByAge", Person.class).setParameter("age", 21).getResultList();

如果一个类定义两个或者以上个的命名查询,那么必须把它放置在@NamedQueries()

2.3.绑定参数

通过前面的例子,我们可以看到绑定参数有两种方式:1.位置参数化绑定。2.命名参数化绑定。都是通过Query接口的setParameter方法进行绑定。

1.位置参数化

TypedQuery setParameter(int position, Object value);

2.命名参数化

TypedQuery setParameter(String name, Object value);

第一种位置参数化绑定,如果位置发生变化都需要改变绑定的代码。推荐使用第二种。

2.4.执行查询

Query接口与TypedQuery接口提供了三种不同的方式执行查询。

1.executeUpdate

用来执行批量更新或者删除

2.getSingleResult

获取单个结果集。如果没有获取到数据,则会抛出NoResultException异常。如果获取多条数据的话,则会抛出NonUniqueResultException异常

3.getResultList

获取对应的结果集合,指定顺序的集合,需要使用List作为返回值类型。如果没有获取到数据的话,则返回一个空集合,不会抛出异常

2.5.分页

通过setFirstResult() 和setMaxResults() 方法可以完成分页的查询

查询页码为0,每页展示2条数据

List people = entityManager.createQuery("select p from Person p ", Person.class).setFirstResult(0).setMaxResults(2).getResultList();

Tip:不能用于通过集合关系连接的查询,因为这些查询可能返回重复的值。

2.6.查询超时

如果一个应用程序需要设置查询响应时间的限制,那么可以在查询中设置javax.persistence.query.timeout属性(jpa 2.0引入)或者将它作为持久化属性的一部分。此属性定义了查询在终止前允许允许运行的==毫秒数==。如果查询超时的时候,会抛出QueryTimeoutException。

TypedQuery query = entityManager.createQuery("select p from Person p", Person.class);

//单位为毫秒 javax.persistence.query.timeout

query.setHint("javax.persistence.query.timeout", 5000);

List people = query.getResultList();

2.7.批量更新和删除

批量更新实体是通过update语句完成。批量删除实体是通过delete语句完成。两者皆指定的是实体及其类的属性。

entityManager.getTransaction().begin();

Query query = entityManager.createQuery("update Person p set p.firstName=:name where p.id=:id");

query.setParameter("name", "xiaobai");

query.setParameter("id", 2);

query.executeUpdate();

Query query1 = entityManager.createQuery("delete Person p where p.id=:id");

query1.setParameter("id", 9);

query1.executeUpdate();

entityManager.getTransaction().commit();

3.使用JPQL查询的建议

在应用系统中,通常使用查询的次数要比增加、修改、删除要多。故合理的使用查询显的尤为重要。

1.建议采用命名查询(NamedQuery)

持久化提供的程序通常会采用预编译的方式将命名查询作为程序初始化阶段的一部分。这样就避免了连续解析JPQL和生成SQL的系统开销。

2.大数量优先使用投影方式检索少量的列

jpa查询通常返回的是整个实体的所有列,但是对于庞大的数据量而言,并不是所有的实体列都需要用到。那么我们可以使用投影的方式来处理。

List> persons = entityManager.createQuery("select new List(firstName,age) from Person p").getResultList();

for (Object o : persons) {

System.out.println(o);

}

//输出结果

[Jack, 21]

[Jack, 21]

[Jack, 21]

[lily, 19]

[tom, 23]

[tom, 23]

php增删改查参数化,JPA之使用JPQL语句进行增删改查相关推荐

  1. JPA @Modifying注解 jpql语句更新以及删除

    JPA @Modifying注解解释 这个注解在JPA中经常出现,是为了通知jpa,这是一个update或者delete操作,在更新或者删除操作时,此注解必须加,否则就会抛出异常,注:jpa不支持in ...

  2. vs连接mysql建一个表并增删查改_VS连接SQL Server数据库,增删改查详细教程(C#代码)...

    工具: 1.Visual Studio (我使用的是vs2013) 2.SQL Server  (我使用的是sql server2008) 操作: 1.打开SQL Server,打开后会看到数据库的初 ...

  3. Spring Data JDBC自动生成的增删改查CRUD分页、排序SQL语句非常简洁没有多余的SQL

    通过在application.properties文件中设置记录SQL日志 logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG ...

  4. MySQL 使用SQL语句实现 增删改查

    MySQL 使用SQL语句实现 增删改查 环境准备:MySQL,navicat 一.增加数据 语法: INSERT INTO 表名(字段1,字段2,字段3...) VALUES(值1,值2,值3... ...

  5. Java程序-单链表增删改查(实现对水浒人物的增删改查操作)

    单链表增删改查(实现对水浒人物的增删改查操作) 前言 一.链表(Linked List)介绍 二.应用实例 1.问题描述 2.代码实现 总结 前言 参考:B站,尚硅谷数据结构与算法 课程 一.链表(L ...

  6. JPA入门、JPQL

    1.什么是JPA?(JPA规范本质上就是一种ORM规范. 全称Java Persistence API,可以通过注解或者XML描述[对象-关系表]之间的映射关系,并将实体对象持久化到数据库中. 为我们 ...

  7. JPA基础学习三-----JPQL语句学习

    jpql是JPA操作数据库的语言,它的底层还是sql语句,就是我们的jpql语言最终还是会转化为sql语句到数据库去做相应的操作.所以JPAQL与sql语句很相识,它们的关键字是一样的,最大的一个区别 ...

  8. JPA学习(6)JPQL

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

  9. mysql 主键 下一个值_INNODB自增主键的一些问题 vs mysql获得自增字段下一个值

    root@localhost : test 04:23:28>show variables like 'innodb_autoinc_lock_mode'; +----------------- ...

最新文章

  1. 【细品架构12/100】架构漫谈系列脑图
  2. 嵌入层 tf.keras.layers.Embedding() 介绍【TensorFlow2入门手册】
  3. java速算24,Java扑克牌速算24的方法
  4. ITK:删除一个未连接到其边界的二进制图像中的孔
  5. cocos2d-lua 搓牌效果_4款热门面霜评测,欧莱雅效果一般,艾珂薇性价比高,菲洛嘉最贵...
  6. 在 Rolling Update 中使用 Health Check - 每天5分钟玩转 Docker 容器技术(146)
  7. 【MATLAB统计分析与应用100例】案例009:创建一个RandStream类对象,调用其randn方法生成标准正态分布随机数
  8. 编译hotspot_从Hotspot JIT编译器打印生成的汇编代码
  9. insert select 过滤掉重复数据
  10. python读取pdf文件 pdfplumber_Python pdfprumber用于PDF表提取,pythonpdfplumber,表格
  11. 聊聊ES7与ES8特性
  12. @configuration注解_Spring注解@Configuration
  13. 黑马程序员_银行业务调度系统
  14. 高新科技培育钻石,或掀时尚界新热潮
  15. 解决网易云音乐ubuntu客户端播放中无声音
  16. 小程序海报二维码生成插件
  17. 如何搭建SPA-单页面应用
  18. 最小费用最大流之 zkw费用流与普通费用流
  19. 【持续更新】Jetson Nano 人工智能机器人开发实战案例——RosmasterX3A1
  20. css点击字变颜色_使用CSS颜色关键字

热门文章

  1. 手机画面尺寸多少满屏_各种大屏手机之中适合用户的最佳尺寸是多少?
  2. 计算机网络在地理信息系统中应用,计算机网络在地理信息系统中有哪些应用?...
  3. 《深入理解分布式事务》第十章 最大努力通知型分布式事务原理
  4. Redis模式对比:主从模式 VS 哨兵sentinel模式 VS Redis cluster模式
  5. ES6高级技巧(五)
  6. [cerc2012][Gym100624C]20181013
  7. FTP和TCP、UDP
  8. Activiti 学习笔记记录(2016-8-31)
  9. property属性[Python]
  10. RHEL6.3 ftp服务器参数的戏说——不看白不看,看了不白看