当前位置: 首页 > news >正文

【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);}}

相关文章:

  • PyMySQL连接池
  • 【YashanDB知识库】ODBC驱动类问题定位方法
  • AI-driven Robotics专栏目录
  • CTF网络安全大赛简单的web抓包题目:HEADache
  • 线程安全 - 笔记
  • 解锁Android高效数据传输的秘钥 - Parcelable剖析
  • 数据库基础+增删查改初阶
  • P2341 受欢迎的牛
  • mac m1安装homebrew管理工具(brew命令)完整流程
  • 【源码】2024完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城
  • uniapp中二次封装jssdk和使用
  • 如何让你的网站能通过域名访问
  • 【数据结构】探索树中的奇妙世界
  • 断开自定义模块与自定义库的链接
  • 网易面试:手撕定时器
  • 收藏网友的 源程序下载网
  • Angularjs之国际化
  • ECS应用管理最佳实践
  • js递归,无限分级树形折叠菜单
  • Laravel 菜鸟晋级之路
  • magento2项目上线注意事项
  • Octave 入门
  • PaddlePaddle-GitHub的正确打开姿势
  • springboot_database项目介绍
  • 从零开始学习部署
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 记一次和乔布斯合作最难忘的经历
  • 聚类分析——Kmeans
  • 实现简单的正则表达式引擎
  • 思否第一天
  • 【云吞铺子】性能抖动剖析(二)
  • AI算硅基生命吗,为什么?
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • ​香农与信息论三大定律
  • ‌[AI问答] Auto-sklearn‌ 与 scikit-learn 区别
  • # windows 运行框输入mrt提示错误:Windows 找不到文件‘mrt‘。请确定文件名是否正确后,再试一次
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • (1)(1.11) SiK Radio v2(一)
  • (1)bark-ml
  • (k8s)kubernetes 部署Promehteus学习之路
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)手动添加用户和文件的特殊权限
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (一)Thymeleaf用法——Thymeleaf简介
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET命名规范和开发约定
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .NET中GET与SET的用法
  • /etc/fstab 只读无法修改的解决办法
  • @Documented注解的作用
  • [12] 使用 CUDA 进行图像处理
  • [20150321]索引空块的问题.txt