springboot获取hibernate的session进行更精细的SQL操作,默认的jpa并不能满足一些复杂需求(可能是我把需求设计复杂了)
通过查看JpaRepository的底层实现,发现是通过EntityManager进行数据库会话操作,因此进一步获取它管理的会话。

  1. @Autowired
  2. private UserDao userDao;
  3. @Autowired
  4. private EntityManager entityManager;
  5. @Transactional// 涉及更新删除,需要开启事务
  6. @Override
  7. public void run(ApplicationArguments args) throws Exception {
  8. // 获取会话,,,使用 unwrap 返回 EntityManager 的底层实现
  9. Session session = entityManager.unwrap(Session.class);
  10. User byUsername = userDao.findByUsername("123");
  11. if (byUsername == null) {
  12. User user = new User();
  13. user.setUsername("123");
  14. user.setPassword("123");
  15. user.setNickname("管理员");
  16. session.save(user);
  17. // springboot 2.3.12 使用的是 hibernate 5.4.x
  18. List username = session.createQuery("from User u where username=:username")
  19. .setParameter("username", "123").list();
  20. System.out.println(username);
  21. Role role = new Role();
  22. role.setName("admin");
  23. session.save(role);
  24. UserToRole userToRole = new UserToRole();
  25. userToRole.setUser(user);
  26. userToRole.setRole(role);
  27. session.save(userToRole);
  28. Authority authority = new Authority();
  29. authority.setUrl("/**");
  30. session.save(authority);
  31. Menu menu = new Menu();
  32. menu.setUrl("/index");
  33. menu.setSeq(0);
  34. menu.setTitle("主页");
  35. session.save(menu);
  36. session.save(new RoleToAuthority(role, authority));
  37. session.save(new RoleToMenu(role, menu));
  38. }
  39. // 此处要注意 使用User的细节
  40. List username = session.createQuery("from User u where username=:username")
  41. .setParameter("username", "123").list();
  42. System.out.println(username);
  43. }

我们注意到上面使用User的细节,不是使用表名ad_user,而是直接使用实体User,

  1. @Entity
  2. @Table(name = "ad_user") // import javax.persistence.Table
  3. @org.hibernate.annotations.Table(appliesTo = "ad_user", comment = "用户表")
  4. @Data
  5. public class User
  6. // 对应 User
  7. List username = session.createQuery("from User u where username=:username")
  8. .setParameter("username", "123").list();
  1. @Entity(name = "ad_user")
  2. //@Table(name = "ad_user") // import javax.persistence.Table
  3. @org.hibernate.annotations.Table(appliesTo = "ad_user", comment = "用户表")
  4. @Data
  5. public class User
  6. // 对应 ad_user
  7. List username = session.createQuery("from ad_user u where username=:username")
  8. .setParameter("username", "123").list();

建议使用第一种!

springboot-jpa获取session的更多相关文章

  1. SpringBoot JPA懒加载异常 - com.fasterxml.jackson.databind.JsonMappingException: could not initialize proxy

    问题与分析 某日忽然发现在用postman测试数据时报错如下: com.fasterxml.jackson.databind.JsonMappingException: could not initi ...

  2. Springboot Jpa: [mysql] java.sql.SQLException: Duplicate entry 'XXX' for key 'PRIMARY'

    前言 1.问题背景 偶尔会出现登录请求出错的情况,一旦失败就会短时间内再也登录不上,更换浏览器或者刷新可能会暂时解决这个问题. 项目运行日志如下: 2022-07-21 09:43:40.946 DE ...

  3. 补习系列(19)-springboot JPA + PostGreSQL

    目录 SpringBoot 整合 PostGreSQL 一.PostGreSQL简介 二.关于 SpringDataJPA 三.整合 PostGreSQL A. 依赖包 B. 配置文件 C. 模型定义 ...

  4. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础授权权限

    上一篇<[原]无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限>介绍了实现Shiro的基础认证.本篇谈谈实现 ...

  5. 【原】无脑操作:IDEA + maven + Shiro + SpringBoot + JPA + Thymeleaf实现基础认证权限

    开发环境搭建参见<[原]无脑操作:IDEA + maven + SpringBoot + JPA + Thymeleaf实现CRUD及分页> 需求: ① 除了登录页面,在地址栏直接访问其他 ...

  6. 解决SpringBoot+JPA中使用set方法时自动更新数据库问题

    项目进行了三分之二了,突然出现一个很诡异的bug,数据库存储的用户表中密码信息总是自动消失一部分,头疼了几天后突然想起同事有个对低权限用户查询的用户信息向前台传送时会把密码设成null后再传输,心想是 ...

  7. SpringBoot Jpa入门案例

    版权声明:署名,允许他人基于本文进行创作,且必须基于与原先许可协议相同的许可协议分发本文 (Creative Commons) 我们先来了解一下是什么是springboot jpa,springboo ...

  8. 基于SpringBoot+Redis的Session共享与单点登录

    title: 基于SpringBoot+Redis的Session共享与单点登录 date: 2019-07-23 02:55:52 categories: 架构 author: mrzhou tag ...

  9. SpringBoot 集成 Spring Session

    SpringBoot 集成 Spring Session 应该讲解清楚,为什么要使用 Redis 进行 Session 的管理. Session 复制又是什么概念. Spring Session 在汪 ...

  10. Springboot+JPA下实现简易爬虫:豆瓣电视剧数据

    Springboot+JPA下实现简易爬虫:豆瓣电视剧数据 前言:今天听到产品那边讨论一些需求,好像其中一点是用户要求我们爬虫,在网页上抓取一些数据然后存到我们公司数据库中,众所周知,爬虫的实现对于p ...

随机推荐

  1. C++20起支持的一个小特性

    注释掉的为传统的写法,从C++20起支持default关键字修饰的写法,即使是成员变量有多个的时候也支持,减轻了程序员的心智负担.

  2. commons中StringUtils的全解

    StringUtils()方法的导入包是:org.apache.commons.lang3.StringUtils 作用是:StringUtils()方法是 Apache Commons Lang 库 ...

  3. Python-文件读取过程中每一行后面带一行空行。贼简单!!!!

    关键点在于,将open()函数中,参数为w的一行,格式如下: csvfile = open(data_path + '-21w.csv', 'w') 加上一个参数为newline=' ' 格式如下: ...

  4. CSS 多行文本超链接下划线动效

    先看效果 乍一看,是不是感觉很简单,仔细一瞅发现事情好像没有那么简单. 如果十分钟还没想出怎么实现,那就把简历上的"精通css"改成"了解css"-- 大部分人 ...

  5. 14.11 Socket 基于时间加密通信

    在之前的代码中我们并没有对套接字进行加密,在未加密状态下我们所有的通信内容都是明文传输的,这种方式在学习时可以使用但在真正的开发环境中必须要对数据包进行加密,此处笔者将演示一种基于时间的加密方法,该加 ...

  6. [C++]P5024 树形DP 保卫王国

    树形DP 保卫王国P5024 前置知识 1.邻接表 + Dfs(深度优先搜索) 2.基础DP(如 01背包 ) 3.最小公共祖先(LCA) LCA我有写过Blog 首先解读一下题意 城市即为节点 每个 ...

  7. 【pwn】[MoeCTF 2022]babyfmt --格式化字符串漏洞,got表劫持

    拿到程序,先checksec一下 发现是Partial RELRO,got表可修改 当RELRO保护为NO RELRO的时候,init.array.fini.array.got.plt均可读可写:为P ...

  8. Ubuntu部署雷池Waf社区版

    安装docker环境 更新软件包 sudo apt update 安装docker环境 apt-get install docker.io docker -v 安装docker compose V2版 ...

  9. dmd-50

    按r键将其转换为字符 再将其拷贝下来 将其md5解密 得到一串英文,根据wp需要再将其加密一下,不知道为啥,得到的md5即为flag

  10. easy ui 按钮图标样式合集

    data-options="iconCls:'icon-search'" 可替换以下值 icon-add icon-print icon-mini-add icon-cvs ico ...