JPA默认方法查询遇到转JSON的处理

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

posted @ 2019-06-13 18:03  一心二念  阅读(3217)  评论(0编辑  收藏  举报