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. hdu多校第五场1002 (hdu6625) three arrays 字典树/dfs

    题意: 给你两个序列a,b,序列c的某位是由序列a,b的此位异或得来,让你重排序列ab,找出字典序最小的序列c. 题解: 如果能找到a,b序列中完全一样的值当然最好,要是找不到,那也尽量让低位不一样. ...

  2. LeetCode 1041. Robot Bounded In Circle (困于环中的机器人)

    题目标签:Math 题目让我们判断机器人是否是一直在走一个圈. 当我们把 instructions 走完一遍时候: 1. 如果机器人回到了原点,那么它是在走一个圈. 2. 如果机器人的方向没有改变,那 ...

  3. KEIL, MDK 关于C99结构体变量初始化

    C99:here 例如声明了这样的结构体 void test1() { tt_t t1 ={ .a = , .d = 'd', .b = , .c = }; static tt_t t2 = { ,, ...

  4. A1095 Cars on Campus (30 分)

    Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...

  5. SparkListener监听使用方式及自定义的事件处理动作

    本文针对spark 2.0+版本 概述 spark 提供了一系列整个任务生命周期中各个阶段变化的事件监听机制,通过这一机制可以在任务的各个阶段做一些自定义的各种动作.SparkListener便是这些 ...

  6. 3.4_springboot2.x整合spring Data Elasticsearch

    Spring Data Elasticsearch 是spring data对elasticsearch进行的封装. 这里有两种方式操作elasticsearch: 1.使用Elasticsearch ...

  7. myeclipe 中配置maven

    1.配置maven 2. 2

  8. C 常见字符串操作函数

    头文件 <string.h> 1. char *strstr(const char *str1, const char *str2);      判断str2是否为str1的子串  //s ...

  9. 2019牛客暑期多校训练营(第八场)I-Inner World DFS序+主席树(扫描线也可)

    题目传送门 题意:初始有n棵树,每棵树都只有1个n号节点,现在有m次添加操作,每次操作是将$[l,r]$范围内的树的$u$节点后面添加一个$v$节点.每个v节点只会被添加一次. 然后是q次询问,输出$ ...

  10. 【leetcode题目整理】数组中找子集

    368. Largest Divisible Subset 题意:找到所有元素都不同的数组中满足以下规则的最大子集,规则为:子集中的任意两个元素a和b,满足a%b=0或者b%a=0. 解答:利用动态规 ...