JPA联合主键@EmbeddedId使用详解附查询例子

时间:2024-01-05 09:31:26
花了2个小时的时间解决这个问题,网上资料太少,记录下
详情看源文件TBicPrmCompute,TBicPrmComputePK
JPA联合主键@EmbeddedId使用详解附查询例子JPA联合主键@EmbeddedId使用详解附查询例子
package com.isoftstone.core.domain;

import java.io.Serializable;
import javax.persistence.*; /**
* The persistent class for the T_BIC_PRM_COMPUTE database table.
*
*/
@Entity
@NamedQueries( {
@NamedQuery(name = "findPrmComputeById", query = "select d from TBicPrmCompute d where d.id.CBisCode = ?1 and d.id.CBicNo = ?2 and d.id.CProdNo = ?3")
} )
@Table(name="T_BIC_PRM_COMPUTE")
public class TBicPrmCompute implements Serializable {
private static final long serialVersionUID = 1L;
private TBicPrmComputePK id;
private String cBsnsTyp;
private String cCmpnyAgtCde;
private String cSlsCde;
private String cYl1;
private String cYl2;
private Double nMaxInsrntTm;
private Double nMinInsrntTm;
private Double nRate;
private Double nTotalAmt; public TBicPrmCompute() {
} @EmbeddedId
public TBicPrmComputePK getId() {
return this.id;
} public void setId(TBicPrmComputePK id) {
this.id = id;
} @Column(name="C_BSNS_TYP")
public String getCBsnsTyp() {
return this.cBsnsTyp;
} public void setCBsnsTyp(String cBsnsTyp) {
this.cBsnsTyp = cBsnsTyp;
} @Column(name="C_CMPNY_AGT_CDE")
public String getCCmpnyAgtCde() {
return this.cCmpnyAgtCde;
} public void setCCmpnyAgtCde(String cCmpnyAgtCde) {
this.cCmpnyAgtCde = cCmpnyAgtCde;
} @Column(name="C_SLS_CDE")
public String getCSlsCde() {
return this.cSlsCde;
} public void setCSlsCde(String cSlsCde) {
this.cSlsCde = cSlsCde;
} @Column(name="C_YL1")
public String getCYl1() {
return this.cYl1;
} public void setCYl1(String cYl1) {
this.cYl1 = cYl1;
} @Column(name="C_YL2")
public String getCYl2() {
return this.cYl2;
} public void setCYl2(String cYl2) {
this.cYl2 = cYl2;
} @Column(name="N_MAX_INSRNT_TM")
public Double getNMaxInsrntTm() {
return this.nMaxInsrntTm;
} public void setNMaxInsrntTm(Double nMaxInsrntTm) {
this.nMaxInsrntTm = nMaxInsrntTm;
} @Column(name="N_MIN_INSRNT_TM")
public Double getNMinInsrntTm() {
return this.nMinInsrntTm;
} public void setNMinInsrntTm(Double nMinInsrntTm) {
this.nMinInsrntTm = nMinInsrntTm;
} @Column(name="N_RATE")
public Double getNRate() {
return this.nRate;
} public void setNRate(Double nRate) {
this.nRate = nRate;
} @Column(name="N_TOTAL_AMT")
public Double getNTotalAmt() {
return this.nTotalAmt;
} public void setNTotalAmt(Double nTotalAmt) {
this.nTotalAmt = nTotalAmt;
} }
package com.isoftstone.core.domain;

import java.io.Serializable;
import javax.persistence.*; /**
* The primary key class for the T_BIC_PRM_COMPUTE database table.
*
*/
@Embeddable
public class TBicPrmComputePK implements Serializable {
//default serial version id, required for serializable classes.
private static final long serialVersionUID = 1L;
private String cProdNo;
private String cBisCode;
private String cBicNo; public TBicPrmComputePK() {
} @Column(name="C_PROD_NO")
public String getCProdNo() {
return this.cProdNo;
}
public void setCProdNo(String cProdNo) {
this.cProdNo = cProdNo;
} @Column(name="C_BIS_CODE")
public String getCBisCode() {
return this.cBisCode;
}
public void setCBisCode(String cBisCode) {
this.cBisCode = cBisCode;
} @Column(name="C_BIC_NO")
public String getCBicNo() {
return this.cBicNo;
}
public void setCBicNo(String cBicNo) {
this.cBicNo = cBicNo;
} public boolean equals(Object other) {
if (this == other) {
return true;
}
if (!(other instanceof TBicPrmComputePK)) {
return false;
}
TBicPrmComputePK castOther = (TBicPrmComputePK)other;
return
this.cProdNo.equals(castOther.cProdNo)
&& this.cBisCode.equals(castOther.cBisCode)
&& this.cBicNo.equals(castOther.cBicNo); } public int hashCode() {
final int prime = 31;
int hash = 17;
hash = hash * prime + this.cProdNo.hashCode();
hash = hash * prime + this.cBisCode.hashCode();
hash = hash * prime + this.cBicNo.hashCode(); return hash;
}
}
关键是查询JPQL的写法费了较久时间
@NamedQueries( {
     @NamedQuery(name = "findPrmComputeById", query = "select d from TBicPrmCompute d where d.id.CBisCode = ?1 and d.id.CBicNo = ?2 and d.id.CProdNo = ?3")
} )
DAOImpl实现类
     @Transactional
     @Override
     public TBicPrmCompute findPrmComputeById(String cBisCode, String cBicNo, String cProdNo)
               throws DataAccessException {
          Query query = createNamedQuery("findPrmComputeById", -1, -1, cBisCode, cBicNo, cProdNo);
          return (TBicPrmCompute) query.getSingleResult();
     }
调用接口
TBicPrmCompute tBicPrmCompute = prmComputeDAO.findPrmComputeById(cBisCode, cBicNo, cProdNo);
需要注意的是
     @EmbeddedId
     public TBicPrmComputePK getId() {
          return this.id;
     }
一般写JPQL的属性是from EntityA d where d.PropertyGetName
但是由于联合主键对象需要用来作JPQL的条件,看上面的联合主键ID,比如想拿ID中的A属性作条件,写法是d.id.A=?1
这里不是get方法的名字呢,直接是属性名字后再是get方法名字getA()去掉get之后的A