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