JPA乐观锁&jpql_day04

Ubuntu 24.04 下 NoMachine 极速安装与远程桌面配置全攻略 本文详细介绍了在Ubuntu 24.04系统下安装和配置NoMachine远程桌面的完整指南。从系统准备、分步安装到性能调优和常见问题解决,帮助用户快速实现低延迟的远程桌面访问。特别适合开发者和IT管理员在Linux环境下高效部署远程工作环境。 阅读详情

1 jpql

概念:
jpa 持久化的查询语言,它和sql是类似,但是还是有区别
jpql规范写法:

  1. 在jpql里面, 不能出现* 和表名,只能出现对象别名,或者类名(类的完全限定名)
  2. 关键字和sql里面 一样的 不区分大小写
  3. 类名和属性名 区分大小写
    jpql写法:
select o
from Employee o
where  o.属性名 
group by 
order by
having 

2 jpql练习

2.1 基本查询

查询所有员工的姓名和所属部门名称【查询特定属性】

//查询所有员工的姓名和所属部门名称【查询特定属性】
@Test
public void testQuery1() throws Exception {
	String jpql = "select e.name,e.department.name from Employee e";
	EntityManager entityManager = Junit.getEntityManager();
	Query query = entityManager.createQuery(jpql);
	List<Object[]> list = query.getResultList();
	for (Object[] o : list) {
	   System.out.println(Arrays.toString(o));
	}
}

查询出所有在成都和广州工作的员工【查询结果过滤】

//查询出所有在成都和广州工作的员工【查询结果过滤】
    @Test
    public void testQuery2() throws Exception {
        String jpql = "select e from Employee e where e.department.city like ? or e.department.city like ?";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1, "%成都%").setParameter(2, "%广州%");
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

查询出所有员工信息,按照月薪排序【查询排序】

    //查询出所有员工信息,按照月薪排序【查询排序】
    @Test
    public void testQuery3() throws Exception {
        String jpql = "select e from Employee e order by e.salary desc";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

查询出所有员工信息,按照部门编号排序【使用关联对象属性排序】

    //查询出所有员工信息,按照部门编号排序【使用关联对象属性排序】
    @Test
    public void testQuery4() throws Exception {
        String jpql = "select e from Employee e order by e.department.sn desc";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

查询出在恩宁路和八宝街上班的员工信息【使用IN】

    //查询出在恩宁路和八宝街上班的员工信息【使用IN】
    @Test
    public void testQuery5() throws Exception {
        String jpql = "select e from Employee e where e.department.street in(?1,?2)";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1,"恩宁路").setParameter(2, "八宝街");
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

查询出工资在5000-6000的员工【使用BETWEEN…AND…】

    //查询出工资在5000-6000的员工【使用BETWEEN..AND..】
    @Test
    public void testQuery6() throws Exception {
        String jpql = "select e from Employee e where e.salary between :min and :max ";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        query.setParameter("min", new BigDecimal("5000")).setParameter("max", new BigDecimal("6000"));
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

查询出姓名包含er或者en的员工【使用LIKE】

    //查询出姓名包含er或者en的员工【使用LIKE】
    @Test
    public void testQuery7() throws Exception {
        String jpql = "select e from Employee e where e.name like ? or e.name like ?";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        query.setParameter(1,"%er%").setParameter(2, "%en%");
        List<Employee> list = query.getResultList();
        for (Employee o : list) {
            System.out.println(o);
        }
    }

2.2 distinct

//查询出有员工的部门【distinct】
    @Test
    public void testQuery8() throws Exception {
        String jpql = "select distinct e.department from Employee e ";
        EntityManager entityManager = Junit.getEntityManager();
        Query query = entityManager.createQuery(jpql);
        List<Department> list = query.getResultList();
        for (Department o : list) {
            System.out.println(o);
        }
    }

2.3 集合操作size

查询出有员工的部门【size】

//查询出有员工的部门【size】
@Test
public void testQuery9() throws Exception {
    String jpql = "select d from Department d where d.employees.size>0";
    EntityManager entityManager = Junit.getEntityManager();
    Query query = entityManager.createQuery(jpql);
    List<Department> list = query.getResultList();
    for (Department o : list) {
        System.out.println(o);
    }
}

查询出部门信息,按照部门的员工人数排序

//查询出部门信息,按照部门的员工人数排序
@Test
public void testQuery10() throws Exception {
    String jpql = "select d from Department d order by d.employees.size desc";
    EntityManager entityManager = Junit.getEntityManager();
    Query query = entityManager.createQuery(jpql);
    List<Department> list = query.getResultList();
    for (Department o : list) {
        System.out.println(o);
    }
}

查询出没有员工参与的项目【对集合使用size】

//查询出没有员工参与的项目【对集合使用size】
@Test
public void testQuery11() throws Exception {
    String jpql = "select p from Project p where p.employees.size=0";
    EntityManager entityManager = Junit.getEntityManager();
    Query query = entityManager.createQuery(jpql);
    List<Project> list = query.getResultList();
    for (Project o : list) {
        System.out.println(o);
    }
}

查询出所有员工及部门名称【JOIN/LEFT JOIN】

//查询出所有员工及部门名称【JOIN/LEFT JOIN】
@Test
public void testQuery12() throws Exception {
    String jpql = "select e.name,d.name from Employee e left join e.department d";
    EntityManager entityManager = Junit.getEntityManager();
    Query query = entityManager.createQuery(jpql);
    List<Object[]> list = query.getResultList();
    for (Object[] o : list) {
        System.out.println(Arrays.toString(o));
    }
}

查询出市场部员工信息及电话

//查询出市场部员工信息及电话
@Test
public void testQuery13() throws Exception {
    String jpql = "select e,p from Phone p join p.employee e where e.department.name like ?";
    EntityManager entityManager = Junit.getEntityManager();
    Query query = entityManager.createQuery(jpql);
    query.setParameter(1, "%市场部%");
    List<Object[]> list = query.getResultList();
    for (Object[] o : list) {
        System.out.println(Arrays.toString(o));
    }
}

2.4 聚集函数

//查询出各个部门员工的平均工资和最高工资【使用聚集函数】
@Test
 public void testQuery14() throws Exception {
     String jpql = "select e.department.name,avg(e.salary),max(e.salary) from Employee e group by e.department.name ";
     EntityManager entityManager = Junit.getEntityManager();
     Query query = entityManager.createQuery(jpql);
     List<Object[]> list = query.getResultList();
     for (Object[] o : list) {
         System.out.println(Arrays.toString(o));
     }
 }

3 分页查询

query.setFirstResult(5).setMaxResults(5);

//分页查询
//query.setFirstResult(5).setMaxResults(5);
 @Test
 public void testQuery17() throws Exception {
     String jpql = "select e from Employee e";
     EntityManager entityManager = Junit.getEntityManager();
     Query query = entityManager.createQuery(jpql);
     query.setFirstResult(5).setMaxResults(5);
     List<Employee> list = query.getResultList();
     for (Employee o : list) {
         System.out.println(o);
     }
 }

4 事物并发

4.1 事物的概念

一组操作 要么都成功 要么都失败

4.2 事物特性

  1. 原子性(atomic),事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行
  2. 一致性(consistent),事务在完成时,必须使所有的数据都保持一致状态。
    3.隔离性(insulation),由事务并发所作的修改必须与任何其它并发事务所作的修改隔离。
  3. 持久性(Duration),事务完成之后,它对于系统的影响是永久性的

4.3 事务并发

通常为了获得更好的运行性能,各种数据库都允许多个事务同时运行,这就是事务并发

4.4 事务并发带来的问题

4.4.1 第一类丢失更新

库存是1件
当事务A和事务B同时修改某行的值,

  1. 事务A将数值改为0并提交,购买了一件
  2. 事务B将数值改为0并提交,也购买了一件。这时数据的值为0,事务A所做的更新将会丢失。(相当于就卖出去2件商品)
    解决办法:对行加锁,只允许并发一个更新事务。(JPA中的悲观锁,乐观锁)
4.4.2 脏读
  1. 张三的原工资为4000, 财务人员将张三的工资改为了8000(但未提交事务)
  2. 张三读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!(在缓存中读取)
  3. 而财务发现操作有误,回滚了事务,张三的工资又变为了4000 像这样,张三记取的工资数8000是一个脏数据。
    解决办法:如果在第一个事务提交前,任何其他事务不可读取其修改过的值,则可以避免该问题
4.4.3 虚读(幻读)

目前工资为4000的员工有10人。

  1. 事务1,读取所有工资为4000的员工。
  2. 这时事务2向employee表插入了一条员工记录,工资也为4000
  3. 事务1再次读取所有工资为4000的员工共读取到了11条记录,
    解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题
4.4.4 不可重复读

在一个事务中前后两次读取的结果并不致,导致了不可重复读。

  1. 在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
  2. 在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
  3. 在事务1中,Mary 再次读取自己的工资时,工资变为了2000
    解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题
4.4.5 第二类丢失更新

多个事务同时读取相同数据,并完成各自的事务提交,导致最后一个事务提交会覆盖前面所有事务对数据的改变

4.5 悲观锁

相当于同步效果, 如果一个人操作数据的时候,先把数据锁住,另外一个人必须等待我操作完,释放锁之后,才能进行操作
弊端:如果效率很低
底层: 可以锁行

 transaction;
begin:
 select * from t_employee where id=1 for update;
.......................
 update t_employee set money =money+1000;
commit;

4.6 乐观锁

在这里插入图片描述

4.6.1 Version方式(整数,存储空间小)
// 添加一个私有字段Integer version,不由程序员维护,由JPA自己维护
  @Version
  private Integer version;

4.7 数据库隔离级别

READ UNCOMMITTED(读未提交) 幻想读(虚读)、不可重复读和脏读都允许。
READ COMMITTED 允许幻想读,不可重复读,不允许脏读
REPEATABLE READ 允许幻想读,不允许不可重复读和脏读
SERIALIZABLE :幻想读、不可重复读和脏读都不允许

MySql默认隔离级别为:Repeatable Read(可能会出现虚读)
Oracle 支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别
默认隔离级别为READ COMMITTED
在这里插入图片描述

5 如何优化JPA

  1. 使用双向一对多关联,不使用单向一对多
  2. 灵活使用单向多对一关联
  3. 不用一对一,用多对一取代(不要使用共享主键一对一,使用唯一外键一对一)
  4. 配置对象二级缓存,查询缓存(jpql查询),没有查询条件才使用查询缓存
    5.组合关系集合使用list(顺序,重复),多对多集合使用set
  5. 表字段要少,表关联不要怕多,有二级缓存撑腰,设计表尽量达到第三范式
STM32入门教程:水位传感器应用 这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。 阅读详情

相关推荐

FPGA新手必看:Quartus生成jic文件全流程详解(附AS/JTAG模式选择指南)

本文详细解析了在Quartus中生成JIC文件以固化FPGA程序到Flash的全流程。核心在于理解JIC文件作为连接JTAG调试与AS固化的桥梁作用,并重点阐述了Convert Programming Files工具的关键配置步骤、AS与JTAG模式的选择逻辑,以及烧录过程中的常见问题排查指南,帮助开发者实现程序断电不丢失。

weixin_29271053的博客 274

【Java】SpringData JPA快速上手,关联查询,JPQL语句书写

JPA框架 认识SpringData JPA 使用JPA快速上手 方法名称拼接自定义SQL 关联查询 JPQL自定义SQL语句

m0_73976305的博客 2674

量化交易新手必看:如何用Python快速接入XTP极速交易系统(附避坑指南)

本文为量化交易新手提供了使用Python快速接入中泰证券XTP极速交易系统的完整指南。文章详细介绍了XTP系统的微秒级性能优势、与CTP系统的核心区别,并逐步讲解了环境配置、API连接、资金查询、下单撤单等关键步骤,同时分享了网络维护、订单处理等实战避坑技巧,帮助开发者高效对接专业交易柜台。

life6的博客 659

jpa的jpql语句

这是一个 JPQL(Java Persistence Query Language) 查询语句,它操作的是 实体类 PersPerson 的属性,而不是数据库表字段。这是 JPA 的特性之一:面向对象查询。这里的语句可以称为 jpql (Java 持久化查询语言)✅ 为什么 JPQL 中的属性跟数据库字段不一样?jpa 的映射数据表字段习惯。, 属性名称习惯 使用。

lu2322337891的博客 367

pgsql行列转换

‌是PostgreSQL中的一个函数,用于将一个字符串根据正则表达式进行分割,并将结果返回为一个表格,每个分割后的部分作为一行‌‌。string_agg() 函数是 PostgreSQL 中的一个聚合函数,用于将一个列中的值连接成一个字符串。

chimchim66的博客 3501

企业第三方应用开发概述_测试第三方应用对接企业_以及如何使用流程_Demo演示---企业微信开发002

那么第三方公司开发了应用,做为服务提供商,如果,一个企业想使用这个应用,我开发的这个应用的话,那么。其实就是给我们的应用,安装一个,使用他的企业,分配一共企业 允许这个企业使用我们的应用的功能,可以看到其实就是多了运营规范,因为,第三方应用,其实就相当于,是第三方公司开发的,程序,首先来看一下。然后再来看,这里我们选择这个公司,其实可以,选择到具体的,部门,或者是。然后我们使用一个企业的管理员账号进行,扫码,来授权,这个应用,可以。其实就是指定,我这个企业中,哪个部门,或者哪些员工,可以使用。

添柴程序猿的专栏 412

JPQL(JPA的查询语句)

一JPQL和SQL 1.JPQL和SQL很像,查询关键字都是一样的 2.唯一的区别是:JPQL是面向对象的 二、JPQL书写规则 JPA的查询语言,类似于sql 1.里面不能出现表名,列名,只能出现java的类名,属性名,区分大小写 2.出现的sql关键字是一样的意思,关键字不区分大小写 3.不能写select * 要写select 别名 三、JPQL的简单查询 package cn.it...

Yuncoco的博客 2万+

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

JPA框架中jpql最后的了解

E-R图(数据库工具生成的关系图) E-R图也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型、属性和联系的方法,用来描述现实世界的概念模型 jpql jpql:jpa 持久化的查询语言,它和sql是类似,但是还是有区别 jpql规范写法: ​ (1) jpql 不能出现*号,必须出现对象的别名和属性名区分大小写 (2)jpql的关键字和sql一样,不...

snailisBigbull的博客 397

wireshark提取视频数据之RTP包中提取H264和H265

本文主要描述从wireshark包数据中提取出H264和H265裸流数据方法,裸流通过RTP封包方式发送,从抓包中直接提取视频流数据,进而进行流媒体问题定位

技术控的笔记 17万+

dToF直方图之美_deadtime死区时间

IMX459的死区时间可以在6ns,这个时间是什么级别,车载激光雷达激光器的光脉宽一般都在4ns以上,也就是这个时间贴近去SPAD的死区时间,这就导致了pile up会非常弱,不会有太多数量的光子计数堆积,加上某些SPAD设计,对TDC有一些更深入的考量,所以不需要去校正pile up算法。Sensor层面决定了pile up的复杂程度,如果一个dToF的SPAD一致性非常好,那么pile up校正可以简单到极致,也就是一句代码的事,比如IMX611,优秀到不需要后端去考虑校正pile up。

dream it possible 1433

面向对象的SQL语句——JPQL

文章目录Day39 JPQLjpql概念JPQL书写规则案例事务并发(乐观锁)事务4个特性事务并发隔离机制事务并发带来的问题第一类丢失更新:(在秒杀场景会出现问题)脏读虚读(幻读)不可重复读第二类丢失更新数据库的隔离级别 Day39 JPQL jpql概念 JPQL语句是面向对象的查询语言 JPQL和SQL很像,查询关键字都是一样的 唯一的区别是:JPQL是面向对象的 JPQL书写规则 JPA...

风华流沙君莫笑的博客 1488

Nova — GPU/vGPU 虚拟机

目录 文章目录目录云主机使用显卡的实现方式虚拟显卡物理显卡直通物理显卡虚拟化 云主机使用显卡的实现方式 采用虚拟显卡 采用物理显卡直通 采用物理显卡虚拟化 虚拟显卡 虚拟显卡技术,主要用于虚拟机 Remote Console 领域,如:VNC(Virtual Network Computing,虚拟网络计算机),它能将完整的窗口界面通过网络,传输到另一台计算机的屏幕上。 VNC 主要由 VNC server 和 VNC viewer 两部分组成。用户需先将 VNC server 安装在被远程操控的计算

烟云的计算 2424

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

        jpql是JPA操作数据库的语言,它的底层还是sql语句,就是我们的jpql语言最终还是会转化为sql语句到数据库去做相应的操作。所以JPAQL与sql语句很相识,它们的关键字是一样的,最大的一个区别就是JPQL是面向对象的,我们可以在语句中使用一些面向对象的语法(new 对象,调属性)。建议初学者,可以先学习sql语言。 1.JPQL语句的使用规范 JPA的查询语言,类似于s...

qq_40200756的博客 1189

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

JPA之JPQL

文章目录什么是JPQL?JPQL怎么用?JPQL的查询demoJPQL的占位符与入参问题 什么是JPQL? 所谓JPQL,就是Java Persistence Query Language的缩写,也就是java持久化查询语言.JPQL是一种可移植的查询语言,旨在以面向对象的形式,将SQL语法和简单查询语义绑定在一起·使用这种语言编写的查询是可移植的,可以被编译成所有主流数据库服务器上的SQL。其特...

qq_43615903的博客 1629

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

JPQL 基本使用

环境与上一偏的环境一样 SQL :对数据库 表的与表的字段 操作 JPQL :对java实体类的与类的属性操作 操作步骤: 1.通过工具类获得实体管理器 2.通过实体管理器获得事务管理器开启事务 3.编写jpql语句 4.获得 Query 对象执行jp...

wahaha 1222

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

JPQL

 select name ,age from user; //原生SQL语句select u.name,u.age from User u;  //JPQL语句select u from User u;  //JPQL语句SQL语句是在数据库空间中对字段,列,行进行操作JPQL语句是在EJB实体空间中面向对象,属性进行操作JPQL必须由JPA的JPQL解析器解析为SQL才能执行

孙健的专栏 4万+

如何使用JPQL写纯SQL语句

  使用JPQL,需要把SQL语句修改成类似HQL 语句。SQL 查询的是数据库,而JPQL 查询的是对象和属性,在语法上是有些不同的。对于有些用JPQL 无法写出来的查询,还是使用原生SQL写出来方便   以下给出一个例子,注意语法的区别: JPQL查询 @PersistenceContextprotected EntityManager em; public List&lt;Video...

weixin_34265814的博客 290

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

JPQL --> JPA Query Language --> JPA的查询语句 (另外HQL:Hibernate的查询语句) JPQL本质:JPA通过antlr-2.7.7.jar将JPQL编译成sql并且封装执行的。 JPQL和SQL区别?? --> 它们查询的关键字都是一样的,但JPQL是面向对象的(JPQL只能写java的类名和属性...

郑清 4366

JPA使用之@Query的常用写法

文章目录常规修改使用冒号常规修改使用问号查询返回指定列第1种写法查询返回指定列第2种写法参考 常规修改使用冒号 @Modifying @Query("update StatisticsApply set status = :status where id = :applyId") void updateStatusByApplyId(@Param("applyId") Long applyId, @Param("status") Integer status); 常规修改使用问号 @Modifying @

靖哥哥的博客 4293

JPQL的一些用法

关联(join)   JPQL仍然支持和SQL中类似的关联语法:  left out join/left join  inner join   left join fetch/inner join fetch      left out join/left join等,都是允许符合条件的右边表达式中的Entiies 为空(需要显式使用left join/left outer join 的情

w2222288的专栏 2262

JPQL详解

前提 最近在改bug的时候发现了自己的缺点,在改前端bug的时候非常顺利顺手。但是在改后端bug的时候如果遇到不是太难的问题还可以解决,但是一到难点感觉自己就懵逼! 所以讲解了关于JPQl相关内容 JPA 在说jpql之前必须要说一下什么是JPA,否则在后续学习的时候,你会弄混的。JPA是一种规范,什么是规范呢,规范就是一个钥匙可以开这把锁。一般对于规范来说我们都是用接口,如果有人要...

Judy-命中注定与众不同 2万+
上一篇: JPA映射关系_day03
下一篇: 23种设计模式—代理模式
虞铭轩、
博客等级 码龄7年 3粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值