zoukankan      html  css  js  c++  java
  • @JoinColumnsOrFormulas实现附属表的多字段查询


    /**
    * 产品分类 * @author simm */ @Entity @Table @Data @NoArgsConstructor @Where(clause = "is_deleted = 0") public class ProductCategory extends FullAuditedAggregateRoot { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 图标 */ @OneToOne(cascade = CascadeType.REMOVE,fetch = FetchType.LAZY) @JoinColumnsOrFormulas(value = { @JoinColumnOrFormula(column = @JoinColumn(name="id",referencedColumnName = "refId",insertable = false,updatable = false)), @JoinColumnOrFormula(formula = @JoinFormula(value = "1",referencedColumnName = "refModule")), @JoinColumnOrFormula(formula = @JoinFormula(value = "1",referencedColumnName = "refType")), @JoinColumnOrFormula(formula = @JoinFormula(value = "1",referencedColumnName = "isAck")), }) private FileRecord icon; }

     @JoinColumnOrFormula 的 column 属性,用于设置主表与关联表的主外键关联关系,formula允许写表达式(做多字段的常量查询)。上述的JPA设置方式,相关与sql语句的关联查询,类似于

    select file_record.* from product_category as a
    inner join file_record as b on a.id = b.ref_id and b.ref_module=1 and b.ref_type=1 and is_ack=1

    事实上,JPA的查询并不会因为我们设置了@JoinColumn而生成一个关联查询语句获取实体,它是分两次发起请求。

    -- 1、先查询主表 ----
    select * from product_category where id = 3;
    -- 2、再查询明细表 -------
    select * from file_record where ref_id=3 and ref_module=1 and ref_type=1 and is_ack=1;

    当然,这样的做法对框架来说,取数是最方便的,不管与附属表是OneToOne 还是 ManyToOne还是ManyToMany的关系,主实体的查询永远是一次检索就能正确加载。不读视图就没有主表信息重复的问题。对JPA来讲,@JoinColumn的声明对于附属表的级联更新就有了依据,数据就可以实现级联保存。

  • 相关阅读:
    深入理解定时器系列第二篇——被誉为神器的requestAnimationFrame
    深入理解定时器系列第一篇——理解setTimeout和setInterval
    idea自动生成方法注释(含参数及返回值)
    敲最少的键,编最多的码
    「HAOI2016」食物链
    「SCOI2015」小凸玩矩阵
    后缀自动机详解
    「TJOI2019」大中锋的游乐场
    「TJOI2019」唱、跳、rap 和篮球
    「TJOI2019」甲苯先生的滚榜
  • 原文地址:https://www.cnblogs.com/MrSi/p/14138344.html
Copyright © 2011-2022 走看看