专栏首页生活不止眼前的代码SpringDataJPA笔记(13)-Union查询

SpringDataJPA笔记(13)-Union查询

SpringDataJPA笔记(13)-Union查询

在JPA中,对Union查询可以通过两种方式,一种是通过Inheritance的注解来实现,一种是通过子查询来实现,个人觉得子查询的方式更加灵活一点

来看具体的demo

首先是第一种通过Inheritance的注解

先设置一个基类,包含了要查询出来的属性,这个类并不会生成实际的表

需要注意一点 如果使用这个注解,id不能使用自增长,因为id在多个表中需要保证唯一性

@Data
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class UnionBaseEntity implements Serializable {

    private static final long serialVersionUID = 1846463590189371497L;
    @Id
    private Long id;

    @Column(name = "union_name")
    private String unionName;

    @Column(name = "union_age")
    private Integer unionAge;
}

然后是两张实际要union查询的表

@Data
@Entity
@EqualsAndHashCode(callSuper = true)
@Table(name = "union_one_tb")
public class UnionOneEntity extends UnionBaseEntity {

    @Column(name = "union_one")
    private String unionOne;

}
@Data
@Entity
@EqualsAndHashCode(callSuper = true)
@Table(name = "union_two_tb")
public class UnionTwoEntity extends UnionBaseEntity {

    @Column(name = "union_two")
    private String unionTwo;

}

然后配置相关的repository接口类

public interface UnionBaseRepository extends JpaRepository<UnionBaseEntity, Long>, JpaSpecificationExecutor<UnionBaseEntity>, Serializable {
}
public interface UnionOneRepository extends JpaRepository<UnionOneEntity, Long>, JpaSpecificationExecutor<UnionOneEntity>, Serializable {
}
public interface UnionTwoRepository extends JpaRepository<UnionTwoEntity, Long>, JpaSpecificationExecutor<UnionTwoEntity>, Serializable {
}

先添加几条数据,查看数据库,确实只有两张表

再查看两张表的数据

编写controller,查询数据

    @GetMapping("/list/base")
    public List<UnionBaseEntity> listBase() {
        return unionBaseRepository.findAll();
    }

从swagger页面调用listBase接口

这里会发现一个问题,id相同的两条记录被覆盖了,所以使用这个注解的时候,需要保证id的唯一性

第二种通过子查询的模式

@Data
@Entity
@Immutable
@Subselect("select concat(\'one_\', a.id) as id, a.union_name as union_name, a.union_age as union_age from union_one_tb a " +
        "union all select concat(\'two_\', b.id) as id, b.union_name as union_name, b.union_age as union_age from union_two_tb b ")
@Synchronize({"union_one_tb", "union_two_tb"})
public class UnionSubEntity implements Serializable {

    private static final long serialVersionUID = -3795682088296075408L;
    @Id
    private String id;

    @Column(name = "union_name")
    private String unionName;

    @Column(name = "union_age")
    private Integer unionAge;
}
public interface UnionSubRepository extends JpaRepository<UnionSubEntity, String>, JpaSpecificationExecutor<UnionSubEntity>, Serializable {
}

编写controller

    @GetMapping("/list/sub")
    public List<UnionSubEntity> listSub(){
        return unionSubRepository.findAll();
    }

从swagger页面调用listSub接口,查看数据

子查询的方式更为灵活,特别是对于联合查询的数据没有统一的唯一主键时

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SpringDataJPA笔记(14)-Inheritance注解详解之SINGLE_TABLE

    SpringDataJPA笔记(14)-Inheritance注解详解之SINGLE_TABLE

    yingzi_code
  • SpringDataJPA笔记(5)-子查询

    在数据库实际使用的时候,为了一些业务的设计,有些时候我们需要映射视图到实体,这个时候就可以使用Subselect注解来标注一个视图类

    yingzi_code
  • SpringDataJPA笔记(9)-使用transation注解引发的唯一索引冲突的问题

    SpringDataJPA笔记(9)-使用transation注解引发的唯一索引冲突的问题

    yingzi_code
  • js 函数作用域与this 的指向实例 原

    函数的定义分为2种,(1)直接定义-window 下,内部定义;(2)对象的方法(或对象原型的方法),下面的函数fn1与fn2 是直接定义的函数, doFun...

    tianyawhl
  • Java设计模式学习记录-责任链模式

     已经把五个创建型设计模式和七个结构型设计模式介绍完了,从这篇开始要介绍行为型设计模式了,第一个要介绍的行为型设计模式就是责任链模式(又称职责链模式)。

    纪莫
  • 重读《JavaScript高级程序设计》

    ECMAScript 函数不能像传统意义上那样实现重载。而在其他语言(如Java)中,可以为一个函数编写两个定义,只要这两个定义的签名(接受的参数类型和数量)不...

    嘉明
  • mysql 多表关联查询 实现 全文匹配的 模糊搜索接口 SQLmysql 多表关联查询 实现 全文匹配的 模糊搜索接口 SQL

    在mysql中,有时我们在做数据库查询时,需要得到某字段中包含某个值的记录,但是它也不是用like能解决的,使用like可能查到我们不想要的记录,它比like更...

    一个会写诗的程序员
  • 「查缺补漏」送你 54 道 JavaScript 面试题

    看过源码的同学应该知道,filter源码中,会去判断数组的这个索引值是不是数组的一个属性,有兴趣的同学可以看看我写的这篇关于数组的:[干货?]从详细操作js数组...

    童欧巴
  • 【EJB学习笔记】——实体Bean

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

    DannyHoo
  • Lombok常用注解分享

    以前的Java项目中充斥了太多不友好的代码:POJO的Getter/Setter/toString等等,这些代码由于没有什么技术含量,影响了代码的美观等缺点,让...

    冷小风的IT生活

扫码关注云+社区

领取腾讯云代金券