【Java系列】JPA中实现NatveSql进行多表关联查询

关于JPA

JPA 是一个基于O/R映射的标准规范,定义了标准接口和相关的注解。具体的实现由各厂家自己接接口规范来做,比如本示例中用到的是Hibernate。下面给出相关的配置。

sping:# JPA configurationjpa:database-platform: org.hibernate.dialect.MySQL5InnoDBDialectshow-sql: falsehibernate:#Only for Development configuration. It will DELETE table before CRATE table.#ddl-auto: createnaming:physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategyhikari:maximum-pool-size: 20minimum-idle: 5auto-commit: trueidle-timeout: 30000#pool-name: DatebookHikariCPmax-lifetime: 1800000connection-timeout: 30000connection-test-query: SELECT 1

创建entity

@Entity
@Table(name = "inf_menu")
public class InfMenu {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Integer id;@Column(name = "page_url", length = 45)private String pageUrl;@Column(name = "page_name", length = 45)private String pageName;@Column(name = "code", length = 45)private String code;@Column(name = "parent_menu_id")private Integer parentMenuId;}@Entity
@Table(name = "inf_menu_role")
public class InfMenuRole {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)@Column(name = "id", nullable = false)private Integer id;@Column(name = "menu_id")private Integer menuId;@Column(name = "user_id")private Integer userId;}

创建repository

JPA的Repository已经默认支持如findAll()之类的查询。如果要加上相应的SELECCT * FROM x WHERE x;条件,可以通过增加如下的方法来实现,示例中把userId作为过滤条件。

public interface InfMenuRoleRepository extends JpaRepository<InfMenuRole, Integer> {List<InfMenuRole> findByUserId(Integer userId);
}

创建nativeQuery查询

通过@Query()注解来完成。

public interface InfMenuRoleRepository extends JpaRepository<InfMenuRole, Integer> {List<InfMenuRole> findByUserId(Integer userId);@Query(nativeQuery = true, value = "SELECT b.user_id, b.menu_id, a.id AS role_id, a.parent_menu_id, a.page_name, a.page_url "+"FROM inf_menu_role b "+"LEFT JOIN inf_menu a ON b.menu_id=a.id WHERE b.user_id=?1")List<Object[]> findAllMenuByUserId(Integer userId);
}

查询结果集的处理

由于nativeQuery方式查询出来的结果是以Object[Object[]] 的方式来存储的,所以,使用的时候需要进行转换。

List<SidebarMenu> sidebarMenus = new ArrayList<>();List<Object[]> rows = infMenuRoleRepository.findAllMenuByUserId(sysUser.getUserUid());for (Object[] cells : rows) {int menuId = JPAUtils.toInt(cells, 1);int parentMenuId = JPAUtils.toInt(cells, 3);if (parentMenuId == 0) {SidebarMenu sidebarMenuItem = new SidebarMenu();sidebarMenuItem.setPageName(JPAUtils.toString(cells, 4));sidebarMenuItem.setPageUrl(JPAUtils.toString(cells, 5));List<SidebarMenuSubMenuItem> sidebarMenuSubMenuItems = new ArrayList<>();for (Object[] object1 : rows) {if (JPAUtils.toInt(object1, 3) == menuId) {SidebarMenuSubMenuItem sidebarMenuSubMenuItem = new SidebarMenuSubMenuItem();sidebarMenuSubMenuItem.setName(JPAUtils.toString(object1, 4));sidebarMenuSubMenuItem.setHref(JPAUtils.toString(object1, 5));sidebarMenuSubMenuItems.add(sidebarMenuSubMenuItem);}}// 二级加一级sidebarMenuItem.setSubMenuItems(sidebarMenuSubMenuItems);sidebarMenus.add(sidebarMenuItem);}}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WAMP无法启动mysql

一种原因是原来安装过mysql,mysql默认是自启动的&#xff0c;而WAMP内置mysql会发生冲突&#xff0c;所以 解决方法&#xff1a; winR 输入 services.msc 将mysql关闭&#xff0c;并设为手动模式

Khoj:开源个人AI助手能连接你的在线和本地文档充当你的第二大脑

项目简介 Khoj是一个开源的、个人化的AI助手&#xff0c;旨在充当你的第二大脑。它能够帮助你回答任何问题&#xff0c;不论这些问题是在线上的还是在你自己的笔记中。Khoi 支持使用在线AI模型(例如 GPT-4)或私有、本地的语言模型(例如 Llama3)。你可以选择自托管 Khoj&#x…

AlexNet,LeNet-5,ResNet,VGG-19,VGG-16模型

模型 AlexNet导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映射字典&#xff1a;加载图像数据和对应的标签&#xff1a;构建AlexNet模型&#xff1a;编译模型&#xff1a;训练模型&#xff1a; LeNet-5导入必要的库&#xff1a;加载类别名称&#xff1a;创建标签映…

.net8.0与halcon编程环境构建

1.安装vs2022 2.安装h-12.0.exe ,不要勾选复选框 3.vs2022新建wpf应用程序 4.依赖项添加项目应用,选择halcondotnet.dll 5.安装System.Drawing 安装 HalconDotNet 安装 Rti.HDevEngineDotNet 在工具箱 空白处右键 应用halcon.dll WPF控件也应用halcon.dll 6.xaml申明hal…

5款ai文案自动生成器,让你写作爆款文案不犯难!

现如今&#xff0c;无论是用于社交媒体、广告宣传、网站内容还是其他各种领域&#xff0c;优秀的文案都能吸引更多的关注和流量。但是&#xff0c;对于许多创作者来说&#xff0c;想要创作出高质量的文案并非易事&#xff0c;常常会面临灵感枯竭、思路卡顿等问题。而现在有了一…

raid配置与实战

一、raid理论 1、raid概述 raid&#xff08;磁盘阵列&#xff09;&#xff1a;是用不同的硬盘分区&#xff0c;组成一个逻辑上的硬盘&#xff0c;高可用&#xff08;冗余&#xff09;。 2、raid级别 2.1、raid0条带化存储 数据分散在多个物理磁盘上的存储方式&#xff0c;…

如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!

加密是一种保护信息不被未经授权访问的重要手段。ZIP压缩包作为一种常见的文件压缩格式&#xff0c;zip文件加密是很多人都回去做的一件事情&#xff0c;那么zip加密文件如何解密&#xff1f;有几种方法可以解密呢&#xff1f;今天介绍几种方法给大家。 一、尝试常用密码 我们…

SAP实施方法论

SAP新实施方法论 RDS Activate

大摩“凑热闹”:当前氧化铝紧平衡,任何供给冲击都将导致价格急剧波动

大摩认为&#xff0c;全球有590万吨氧化铝供应受阻&#xff0c;相等于扣除中国后全球供应约一成&#xff0c;而氧化铝需求可能有所上升&#xff0c;同时氧化铝库存缓冲有限&#xff0c;因此任何供给冲击都将导致价格急剧波动。 文章内容 今年以来氧化铝期货价格一路上行&#…

Thingsboard规则链:Customer Attributes节点详解

在物联网(IoT)平台Thingsboard的规则引擎中&#xff0c;Customer Attributes节点扮演了至关重要的角色&#xff0c;它允许用户访问和操作与客户&#xff08;Customer&#xff09;实体相关的属性数据。这些属性可以是静态信息&#xff0c;如客户名称、联系信息&#xff0c;或是动…

python中的互斥锁、死锁、递归锁

互斥锁 Python中的互斥锁&#xff08;Mutex&#xff0c;Mutual Exclusion&#xff09;是一种同步原语&#xff0c;用于防止多个线程同时访问共享资源。在Python中&#xff0c;互斥锁通常是通过threading模块中的Lock类来实现的。 前面文章将的就是互斥锁&#xff1a;python中…

FreeRTOS学习笔记-基于stm32(7)任务状态查询与任务时间统计API函数

1、FreeRTOS任务相关API函数 函数描述uxTaskPriorityGet()查询某个任务的优先级vTaskPrioritySet()改变某个任务的任务优先级uxTaskGetSystemState()获取系统中任务状态vTaskGetInfo()获取某个任务信息xTaskGetApplicationTaskTag()获取某个任务的标签(Tag)值xTaskGetCurrentT…

idea 快捷键运用

ctrl d 向下复制一行 shiftalt↑/↓ 向上或者向下移动光标所在行 shiftctrl↑/↓ 向上或者向下移动光标所在行(自动对齐) shift F6 rename包名或者类名或者批量修改变量名(不建议更改项目名&#xff0c;包名也尽量别改) 输入if 然后ctrlshift回车 补全缺失的括号 shift …

C# 证件照替换底色与设置背景图---PaddleSegSharp

PaddleSegSharp 是一个基于百度飞桨PaddleSeg项目的人像分割模块而开发的.NET的工具类库。 PaddleSegSharp 中PaddleSeg.dll文件是基于开源项目最新发布版本PaddleSeg PaddleSeg的版本修改而成的C动态库&#xff0c;基于opencv的x64编译而成的。 PaddleSeg是基于飞桨PaddlePa…

在RT-Thread下为MPU手搓以太网MAC驱动-3

文章目录 MAC驱动支持不同的PHY芯片关于对PHY设备抽象的改进RT-Thread下PHY设备抽象接口的改进关于对PHY设备抽象的改进 这是个人驱动开发过程中做的一些记录&#xff0c;仅代表个人意见和理解&#xff0c;不喜勿喷 MAC驱动需要支持不同的PHY芯片 MAC驱动支持不同的PHY芯片 关…

spring分析工具_springboot startup analyze的部署和使用

工具是开源工具 ,可以放心使用 我是从开源中国OCSChina看到的顺便安利一下 部署 教程 https://github.com/linyimin0812/spring-startup-analyzer 直接下载地址 https://github.com/linyimin0812/spring-startup-analyzer/releases/download/v3.0.0/spring-startup-analyzer.…

Javaweb基础之Filter

大家好&#xff0c;这里是教授.F 引入&#xff1a; 为什么需要过滤器&#xff1f;&#xff1f;&#xff1f;我们在访问一个项目的时候&#xff0c;常常有很多页面&#xff0c;如果没有过滤器&#xff0c;则我们需要在用户访问一个页面的时候&#xff0c;都要进行一个校验&…

文心智能体平台:快来创建你的Java学习小助理,全方位辅助学习

文章目录 一、文心智能体平台1.1平台介绍1.2智能体介绍 二、智能体创建三、体验与总结 一、文心智能体平台 文心智能体平台是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类…

Python 元组

&#xff08;1&#xff09;元组中只包含一个元素时&#xff0c;需要在元素后面添加逗号&#xff1a; tup1 (50,); &#xff08;2&#xff09;元组中的元素值是不允许修改的&#xff0c;但我们可以对元组进行连接组合&#xff1a; tup1 (12, 34.56); tup2 (abc, xyz);# 以…

3D模型三角面转四角面操作指南---模大狮模型网

在3D建模的过程中&#xff0c;三角面(Triangles)和四角面(Quads)是两种常见的多边形类型。虽然三角面在渲染速度和计算效率上有其优势&#xff0c;但四角面在模型编辑和纹理映射上通常更为方便。因此&#xff0c;将三角面转换为四角面是建模过程中常见的需求。 一、选择合适的建…