• 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

  • 相关阅读:
    C语言qsort函数算法性能测试
    文档流 css中间float clear和布局
    EasyUI Combobox 默认设置
    碳化硅资料整理
    hdu 4864 Task(贪婪啊)
    tiny210——uboot移植Makefile文章分析
    规则字符串大小比较?
    js产生随机数
    四个好看的CSS样式表格
    request的setAttribute()怎么用的?
  • 原文地址:https://www.cnblogs.com/h-c-g/p/11018341.html
Copyright © 2020-2023  润新知