@JoinColumn 匹配关联多个字段

本文探讨了在ORM框架中如何处理一对多关系及复杂条件的关联查询,通过使用@ManyToOne、@OneToOne、@JoinColumn和@JoinFormula等注解,详细介绍了如何在Java Bean上建立与数据库表之间的映射关系,特别强调了@JoinFormula在实现特定业务需求时的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两张表结构如下
TABLE_A:
ID, COLA1, COLA2

TABLE_B:
ID, A_ID, COLB1, COLB2

A和B是一对多的关系。
我在B的BEAN上面,通过Anotation建立如下关系。
@ManyToOne(cascade = CascadeType.REFRESH, targetEntity = TABLE_A.class)
@JoinColumn(name = "A_ID", referencedColumnName = "ID", nullable = true, insertable = false, updatable = false)

现在的问题来了,就是在 TABLE_B.A_ID = TABLE_A.ID同时,还要求TABLE_B.COLB1="ABC"。


解决办法如下:

@OneToOne
    @JoinColumnsOrFormulas(value={
        @JoinColumnOrFormula(column=@JoinColumn(name ="apply_id", referencedColumnName ="apply_id",
                nullable = true, insertable =false, updatable =
                false)),@JoinColumnOrFormula(formula=@JoinFormula(value="'open_id'",
        referencedColumnName = "open_id"))
    })
    private ShareGroupMemberEntity member;

重点就是@JoinFormula的使用(和@JoinColumn类似):

value指明对应列的值(这里也可以写SQL表达式),

referencedColumnName指明列的名称

由于关联关系多于一个,所以,需要使用@JoinColumnsOrFormulas、@JoinColumns、@JoinrFormulas这样的标签,将多个条件包括进来。


package com.kucun.data.entity; import javax.persistence.CascadeType; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; /** * 一个订单中的产品组件订购板材数量 * @author Administrator * */ @Entity public class Dingdan_chanpin_zujian { @Id private Integer id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "dingdan_id") // 指定外键列 private Dingdan dingdan; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "chanpin_zujian_id") // 指定外键列 private Chanpin_zujian zujian; // 修改为单数形式 //板材 @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "bancai_id") private Bancai bancai; //订购数 private Integer shuliang ; public Dingdan_chanpin_zujian() { super(); // TODO Auto-generated constructor stub } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Dingdan getDingdan() { return dingdan; } public void setDingdan(Dingdan dingdan) { this.dingdan = dingdan; } public Bancai getBancai() { return bancai; } public void setBancai(Bancai bancai) { this.bancai = bancai; } public Chanpin_zujian getZujian() { return zujian; } public void setZujian(Chanpin_zujian zujian) { this.zujian = zujian; } public Integer getShuliang() { return shuliang; } public void setShuliang(Integer shuliang) { this.shuliang = shuliang; } } package com.kucun.dataDo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; import com.kucun.data.entity.Chanpin; import com.kucun.data.entity.Dingdan_chanpin_zujian; //ChanpinRepository.java //DingdanChanpinZujianRepository.java @Repository public interface DingdanChanpinZujianRepository extends JpaRepository<Dingdan_chanpin_zujian, Integer> { boolean existsByDingdan_IdAndChanpin_Zujian_Id(Integer dingdanid, Integer chanpin_zujianid); }
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值