jpa vue管理系统_Spring Boot数据JPA –查询嵌套对象

jpa vue管理系统

jpa vue管理系统

如今,spring boot和spring数据已成为广泛使用的框架。 如果要使用Java构建Web应用程序,则首选Spring Boot。 如果您有数据库,那么弹簧数据JPA是最佳选择。 在Spring Boot中,spring数据是数据库交互的默认实现。 使用spring数据JPA的spring boot甚至从方法名称创建嵌套对象查询。

因此,如果您正在使用spring boot或spring data JPA,则必须知道如何在嵌套对象结构的情况下特别创建查询。

介绍

Spring数据JPA提供了存储库抽象,并减少了持久层中的样板代码。 如我们先前的博客Spring data Java初学者中所讨论的,我们可以通过两种方式定义查询,即查询注释和方法名称本身。

对于简单的用例,用于查询解析的方法名称是最佳选择。 但是,对嵌套对象属性使用spring boot而不知道它是如何工作的,可能会在运行时引起大问题。

让我们了解嵌套对象查询中可能出现的问题以及如何解决它。

问题陈述

例如,如果您创建方法findByDepartmentId,查询将是什么? 要么

Select * from ClassRoom where departmentId=?

要么

Select * from ClassRoom c left join department d on <condition> where d.id =?

两者都是取决于类结构的可能性

 Class ClassRoom {

   Long departmentId;
 }

要么

 Class ClassRoom {

    Department department;
 }
 Class Department {

    Long id;
 }

然后最大的问题是,当我们具有以下结构时会发生什么?

 Class ClassRoom {

    Department department;

    Long departmentId;
 }
 Class ClassRoom {

    Department department;

    Long departmentId;
 }

Spring数据如何解析方法名称

让我们看看spring boot中的spring数据jpa如何决定应使用哪种联接以避免错误的select查询。

对于这些课程,请考虑以下对象结构:学生-教室-部门

 Class Student {

    ...

    ClassRoom classRoom;
 }
 Class ClassRoom {

    …..

    Department department;
 }
 Class Department{

    ...

    Long id;
 }

我们将使用上述数据库结构,并尝试了解创建方法findByClassRoomDepartmentId(Long id)时发生的情况

以下是spring数据jpa将执行的创建查询的步骤

  • 首先将完整名称作为域类下的classRoomDepartmentId
  • 如果这与驼峰案例部分右侧的拆分词不匹配,则分为classRoomDepartmentid两部分
    • 检查第一个属性是否匹配,获取该属性,然后继续进行第二部分-保留建筑树
方法名称到属性解析流程图

在大多数情况下,这是可行的,但是,如果我们在Student类中使用Long classRoomDepartment变量,则此方法可能会失败。 JPA将找到第一个匹配项作为classRoomDepartment,它将选择并失败,因为它将尝试在classRoomDepartment内查找Long类的id变量。 但是由于Long类中没有id属性,因此它将失败。

解:

为了解决此问题,我们可以在方法名称中使用'_'(下划线)字符来定义JPA应该尝试拆分的位置。 在这种情况下,我们的方法名称将为findByClassRoom_DepartmentId()

Java命名最佳实践中没有使用下划线,但是spring数据JPA中允许使用下划线。

快速阅读

  • 在Spring数据中,可以使用查询注释或方法名称定义Java查询
  • 对于简单情况,从方法名称派生查询是最佳选择
  • 我们也可以使用方法名称来派生嵌套对象的查询
  • Spring Data JPA从全名开始检查属性,并从右到左在驼峰式大小写开始中断
  • 为避免属性名称混淆,可以使用“ _”(下划线)字符来分隔属性名称

相关话题

翻译自: https://www.javacodegeeks.com/2020/09/spring-boot-data-jpa-query-for-nested-object.html

jpa vue管理系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值