![jpa vue管理系统](https://i-blog.csdnimg.cn/blog_migrate/e99cc3b6bdb961e0629aaf0bcdd712d3.png)
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
- 如果这与驼峰案例部分右侧的拆分词不匹配,则分为classRoomDepartment和id两部分
- 检查第一个属性是否匹配,获取该属性,然后继续进行第二部分-保留建筑树
在大多数情况下,这是可行的,但是,如果我们在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管理系统