使用jpa操作多张表进行关联查询时,有重复数据需要分组去重

1)确定主表:将有重复数据的表格作为主表,表明关系

public class AttendanceRuleTypeItem implements Serializable {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

private Long itemId;

private String name;

private Integer code;

private String dictionaryCode;

@OneToMany

@JoinColumn(name = "typesCode",referencedColumnName = "code")

private List attendanceRules;

}

2.副表两张

public class AttendanceRuleModel {

@Id

@GenericGenerator(name = "guid", strategy = "guid")

@GeneratedValue(generator = "guid")

private String id;

//规则类型code

private Integer ruleCode;

//请假类型code

private Integer typesCode;

//扣罚天数code

private Integer resultNumberCode;

private String rankName;

@OneToOne

@JoinColumn(name = "resultNumberCode", referencedColumnName = "code", insertable = false, updatable = false,

foreignKey = @ForeignKey(value =ConstraintMode.NO_CONSTRAINT ))

private AttendanceRuleTypeItem resultNumber;

@OneToMany(cascade = {CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.MERGE})

@JoinColumn(name = "rule_id",referencedColumnName = "id",foreignKey = @ForeignKey(value =ConstraintMode.NO_CONSTRAINT ))

private List departmentRelation;

@OneToMany(cascade = {CascadeType.PERSIST,/*CascadeType.REMOVE,*/CascadeType.REFRESH})

@JoinColumn(name = "attendance_rule_id",referencedColumnName = "id",foreignKey = @ForeignKey(value =ConstraintMode.NO_CONSTRAINT ))

private List relationAttendanceRanks;

}

public class RelationAttendanceDepartment extends BaseEntity {

@Id

@GeneratedValue(generator = "guid")

@GenericGenerator(strategy = "guid",name = "guid")

private String ruleDeptId;

@Column(name = "rule_id")

private String ruleId;

private Integer departmentId;

public RelationAttendanceDepartment(Integer departmentId) {

this.departmentId = departmentId;

}

public RelationAttendanceDepartment(String ruleId, Integer departmentId) {

this.ruleId = ruleId;

this.departmentId = departmentId;

}

}

3)。确定每张表的关系之后  表连接查询

public PageResultVO> ruleList(QueryPageVO attendance) {

Specification reSpec = (Specification) (root, cq, cb) -> {

Join ruleJoin = root.join("attendanceRules", JoinType.LEFT); //表关联查询 AttendanceRuleTypeItem 为主表

Join deptJoin = ruleJoin.join("departmentRelation", JoinType.LEFT); //两张副表之间的关联关系

Predicate predicate = cb.conjunction();

predicate = cb.and(predicate, cb.equal(deptJoin.get("departmentId"), attendance.getQuery().getId())); //拼接副表中的查询条件

predicate = cb.and(predicate, cb.equal(root.get("dictionaryCode"), "1002")); //拼接朱表中的查询条件

predicate = cb.and(predicate, cb.equal(ruleJoin.get("ruleCode"), 2001)); //拼接副表中的查询条件

cq.where(predicate);

return cq.getRestriction();

};

Page ruleTypeItemPage = ruleTypeItemRepository.findAll(Specification

.where(reSpec)

.and(distinct()), PageRequest.of(attendance.getPages().getPage(), attendance.getPages().getSize()));

List attendanceRuleResultVOS = ruleTypeItemPage.stream().map(r->{

AttendanceRuleResultVO ruleResultVO =new AttendanceRuleResultVO();

ruleResultVO.setTypesName(r.getName());

List ruleVOS = r.getAttendanceRules().stream().map(a-> new RuleVO(a.getId(),getRankName(a),

a.getResultNumber().getName())).collect(Collectors.toList());

ruleResultVO.setRule(ruleVOS);

return ruleResultVO;

}).collect(Collectors.toList());

return new PageResultVO(ruleTypeItemPage.getTotalPages(),(int)ruleTypeItemPage.getTotalElements(),null, attendanceRuleResultVOS);

}

//去重

public Specification distinct() {

return (Root root, CriteriaQuery> criteriaQuery, CriteriaBuilder criteriaBuilder) -> {

criteriaQuery.distinct(true);

return criteriaQuery.getRestriction();

};

}

来源:https://www.cnblogs.com/xiaoxiaoliu/p/10190065.html

jpa 去重_spring boot jpa 表关联查询分组 group by 去重相关推荐

  1. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  2. Spring Data JPA 实现多表关联查询

    原文链接:https://blog.csdn.net/johnf_nash/article/details/80587204 多表查询在spring data jpa中有两种实现方式,第一种是利用hi ...

  3. 【SpringBoot Data JPA】多表关联查询

    SpringBoot Data JPA 多表关联查询 前言 一.数据库架构设计 1.1 数据表结构 2.2 建立数据库表: 二.SpringBoot整合JPA多表查询 2.1 环境配置 2.2 建立数 ...

  4. 解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题)

    解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) 参考文章: (1)解决Springboot+JPA中多表关联查询会查询多次的问题(n+1查询问题) (2)https: ...

  5. jpa多表关联查询_JPA【关联查询篇】

    摘要:本文主要介绍JPA的多表关联查询(一对一.一对多.双向关联.多对一.多对多)以及N+1查询的优化. 1. JPA多表关联查询 多表关联查询就是实现使用一个实体类对象操作或者查询多个表的数据. 配 ...

  6. Spring Data JPA 多表关联查询的实现

    Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...

  7. jpa的多表关联查询

    两种情况 利用root.join()实现表关联 利用join方法实现表关联查询的是时候是依赖于主表对应的实体中存在需要关联的表的实体. 这两者的关系可以是1:1 1:n n:1 n:m 相应的实体中需 ...

  8. Spring Data JPA--多表关联查询--实例

    原文网址:Spring Data JPA--多表关联查询--实例_IT利刃出鞘的博客-CSDN博客 简介 多表联查有以下方案 原生SQL JHQL Specification 实体关联(不推荐) 见: ...

  9. asp多表查询并显示_SpringBoot系列(五):SpringBoot整合Mybatis实现多表关联查询

    本文我们将继续分享介绍Spring Boot在整合Mybatis开发企业级应用时其他典型的业务场景,即Mybatis是如何实现多表关联查询时将查询结果集与对象进行映射的,主要的内容包含"一对 ...

最新文章

  1. html页面中Location对象跳转页面用法
  2. python字典添加数组_一步一步学Python3(小学生也适用) 第十三篇: 字典Dict类型
  3. 带父节点的平衡二叉树_平衡二叉树 通俗易懂
  4. 餐饮智能化:餐饮机器人正当时餐饮机器人的喜与忧
  5. lnmp一键安装远程连接mysql_阿里云 lnmp一键安装包远程访问Mysql
  6. ardruino控制继电器_用 Arduino 实现带继电器的拨动开关
  7. 怎么把分开的pdf放在一起_PDF多页合并为一页的方法是什么 怎么将PDF文件拆分成单页...
  8. 从零学习算法竞赛3:aabb问题
  9. [maya学习笔记(18)] 粒子系统 - 落叶纷飞
  10. 学习yigo遇到的问题
  11. 什么是Python?Python简介
  12. 【认知计算】IBM报告解读《认知中国》— 拉近人工智能未来与现实的距离,中国企业争当认知创新者
  13. 限定性定语从句和非限定性定语从句的区别
  14. OUC2022秋软件工程第14小组作业
  15. CMT2380/HC32L110入门踩坑记录
  16. matlab最基础教程(六):编程习惯
  17. c9和北航计算机哪个好,哈工大是C9高校,北航是普通的985,为何北航的录取分数更高?...
  18. 函数可导但是导函数不连续的例子
  19. 理化生实验操作考试系统(理化生实验考评教室)
  20. 目前较好的私域流量运营软件有哪些?

热门文章

  1. rabbitMQ 实战 高效部署分布式消息队列 读书笔记
  2. IO虚拟化——virtio 原理
  3. 机器学习之线性回归 (Python SKLearn)
  4. ElasticSearch学习,请先看这一篇(win_Elasticsearch)
  5. 极其实用的sql脚本【建议收藏】
  6. 基于servletjspmysql的表格增删改查操作
  7. JVM系列之:JIT中的Virtual Call接口
  8. Amazon Aurora 论文解读
  9. 安卓学习 之 Activity(二)
  10. C++ getline() 和 get()