JPA提供的findAll等查询方法在有关联的对象时

比如:在查userInfo

@Entity
@Table(name = "user_info")
public class UserInfo implements Serializable {
@Id
@GeneratedValue
private Integer uid;
@Column(unique =true)
private String username;//帐号
private String name;//名称(昵称或者真实姓名,不同系统不同定义)
private String password; //密码;
private String salt;//加密密码的盐
private byte state;//用户状态,0:创建未认证(比如没有激活,没有输入验证码等等)--等待验证的用户 , 1:正常状态,2:用户被锁定.
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "SysUserRole", joinColumns = { @JoinColumn(name = "uid") }, inverseJoinColumns ={@JoinColumn(name = "roleId") })
private List<SysRole> roleList;// 一个用户具有多个角色 // 省略 get set 方法

关联的Role对象在userinfo对象转JSON数据返回时,会报无法序列化的异常,因为此时Role对象是代理类,无法实现序列化

网友提供的方法有加json包的然后重写转换器的,有加jsonInogerjson的注解,感觉还是本人的方法直接

首先新建一个model和entity字段一样的类

然后直接转换后再转为json数据

如下

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserInfoResp { private Integer uid;
private String username;//帐号
private String name;//名称(昵称或者真实姓名,不同系统不同定义)
private String password; //密码;
private String salt;//加密密码的盐
private byte state;//用户状态
}
@LoginToken
@ApiOperation("查询用户列表")
@RequiresPermissions("userInfo:view")
@PostMapping("/userInfo/userList")
public Result getUserList(@RequestBody UserInfoReq userInfoReq){
log.info("查询用户列表");
int page = NumberUtils.toInt(userInfoReq.getCurrentPage(), 0);
int size = NumberUtils.toInt(userInfoReq.getPageSize(), 10);
PageHelper.startPage(page,size);
List<UserInfo> userList = userInfoService.getUserList();
ArrayList<UserInfoResp> list = Lists.newArrayList();
Iterator<UserInfo> it = userList.iterator();
while (it.hasNext()){
UserInfoResp resp = new UserInfoResp();
BeanUtils.copyProperties(it.next(),resp);
list.add(resp);
}
PageInfo pageInfo = new PageInfo<>(list);
return Result.success(pageInfo);
}

这样迂回就可以得到JSON数据,而且model类还可以加自己需要的其他字段

JPA的其他使用在记一下

1、JPA提供的方法支持级联查询和级联删除

2、自定义的删除和修改方法注意需要在service的方法上加事物

@Transactional(rollbackFor = Exception.class ,propagation = Propagation.REQUIRED ,isolation = Isolation.READ_COMMITTED)
public void updateRolePermission(SysRoleReq sysRoleReq){
Integer rid = sysRoleReq.getId();
Set<Integer> sets = sysRoleReq.getSets();
sysRoleRepository.deleteRolePermission(rid);
Iterator<Integer> iterator = sets.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
sysRoleRepository.saveRolePermission(next,rid);
}
}

自定义的方法注解使用如下

@Repository
public interface SysRoleRepository extends JpaRepository<SysRole,Integer> { @Modifying
@Query(value = "insert into sys_role_permission(permission_id,role_id) values(?1,?2)",nativeQuery = true)
int saveRolePermission(Integer pid, Integer rid);
@Modifying
@Query(value = "delete from sys_role_permission where role_id =?1)",nativeQuery = true)
int deleteRolePermission(Integer rid);
@Query(value = "select * from sys_role ",nativeQuery = true)
List<SysRole> getRoleList();
}
nativeQuery=true表示为原生的sql

JPA默认方法查询遇到转JSON的处理的更多相关文章

  1. 【tmos】spring data jpa 创建方法名进行简单查询

    参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html

  2. python测试开发django-15.查询结果转json(serializers)

    前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...

  3. Spring data jpa 复杂动态查询方式总结

    一.Spring data jpa 简介 首先我并不推荐使用jpa作为ORM框架,毕竟对于负责查询的时候还是不太灵活,还是建议使用mybatis,自己写sql比较好.但是如果公司用这个就没办法了,可以 ...

  4. 【Spring Data 系列学习】Spring Data JPA @Query 注解查询

    [Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...

  5. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  6. 自定义mysql类用于快速执行数据库查询以及将查询结果转为json文件

    由于每次连接数据库进行查询比较麻烦,偶尔还需要将查询结果转为json格式的文件, 因此暂时定义一个mysql的类,将这些常用的方法进行封装,便于直接调用(代码如下,个人用,没写什么注释). 注:导入了 ...

  7. 学习Spring-Data-Jpa(八)---定义方法查询

    1.查询策略 spring-data一共有三种方法查询策略: QueryLookupStrategy.Key.CREATE,尝试根据方法名进行创建.通用方法是从方法名中删除一组特定的前缀,然后解析该方 ...

  8. @Convert 注解在jpa中进行查询的注意事项

    如果要实现实体类中属性的类型和数据库表中字段的类型相互转化,则需要使用 @Convert 注解 package javax.persistence; import java.lang.annotati ...

  9. 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)

    作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://zh.lucida.me/blog/java-8-lambdas-insideout-language- ...

随机推荐

  1. 39 Ubuntu下配置python的vscode开发环境

    0 引言 最近想在ubuntu下搞深度学习,首先配置了python的vscode开发环境.在配置python时,选择了Anaconda3.x,保证了其相对于系统python2.x的独立性.另外,vsc ...

  2. 自定义alert 确定、取消功能

    以删除为例,首先新建html <table border="1" cellpadding="0" cellspacing="0" id ...

  3. GDI+用PNG图片做半透明异型窗口

    http://hi.baidu.com/bluew/blog/item/2ecbe58bf93a937d9f2fb4de.html2007-08-09 00:52 我是用PNG图片Alpha透明的方式 ...

  4. python中os模块获取路径的几种方式

    一.代码 import os BASE_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) p ...

  5. NAT穿透解决方案介绍(转)--Java ICE实现

    转:http://www.cnblogs.com/javaminer/p/3575282.html 最近公司要实现在各种网络环境下面的多屏互动(机顶盒.android phone.iphone及PC端 ...

  6. 基于Netty的RPC架构学习笔记(四):netty线程模型源码分析(一)

    文章目录 如何提高NIO的工作效率 举个

  7. Date转换为LocalDateTime

    一.在Java 8中将Date转换为LocalDateTime 方法1: 将Date转换为LocalDatetime,我们可以使用以下方法: 1.从日期获取ZonedDateTime并使用其方法toL ...

  8. 普通用户授予root权限

    开始用linux的时候会遇到用户权限问题,比如安装软件的时候经常会提示权限不足,下面介绍给普通用户授予root权限. 找到  cd /etc/sudoers可以看到用户的权限是:只有读取的权限(以下操 ...

  9. USACO2008 Roads Around The Farm /// queue oj23321

    题目大意: N (1 ≤ N ≤ 1,000,000,000)牛群在遇到岔路时,若能分为恰好相差 K (1 ≤ K ≤ 1000)的两路,则持续分裂(假设会一直遇到岔路),否则停止开始吃草. Inpu ...

  10. 一点响应式Web设计与实现思路

    摘要: 是否还在为你的应用程序适配PC端,移动端,平板而苦苦思索呢,是否在寻找如何一套代码适配多终端方式呢,是否希望快速上手实现你的跨终端应用程序呢,是的话,那就看过来吧,本文阐述响应式UI设计相关理 ...