java – 使用复合主键的SELECT查询
发布时间:2020-12-15 04:19:59 所属栏目:Java 来源:网络整理
导读:在使用hibernate和jpa的 spring mvc app中,我最近使用@Embeddable类切换到复合主键.因此,我需要更新基于其唯一ID返回给定对象的JPA查询.以下是过去工作的JPA代码,但不再返回结果: @SuppressWarnings("unchecked")public Concept findConceptById(BigInteger
|
在使用hibernate和jpa的
spring mvc app中,我最近使用@Embeddable类切换到复合主键.因此,我需要更新基于其唯一ID返回给定对象的JPA查询.以下是过去工作的JPA代码,但不再返回结果:
@SuppressWarnings("unchecked")
public Concept findConceptById(BigInteger id) {
Query query = this.em.createQuery("SELECT conc FROM Concept conc WHERE conc.id =:cid");
query.setParameter("cid",id);
return (Concept) query.getSingleResult();
}
如何更改上面的查询,以便返回具有给定id的最新有效时间的Concept?请注意,id和effectiveTime是ConceptPK复合主键的两个属性,因此id和effectiveTime的属性定义和getter以及setter在ConceptPK类中,而不在Concept类中. 上面抛出的错误是: Caused by: java.lang.IllegalArgumentException: Parameter value [786787679] did not match expected type [myapp.ConceptPK] 这是现在在Concept类中定义主键的方式: private ConceptPK conceptPK; 这是ConceptPK类的代码: @Embeddable
class ConceptPK implements Serializable {
@Column(name="id",nullable=false)
protected BigInteger id;
@Column(name="effectiveTime",nullable=false)
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime effectiveTime;
public ConceptPK() {}
public ConceptPK(BigInteger bint,DateTime dt) {
this.id = bint;
this.effectiveTime = dt;
}
/** getters and setters **/
public DateTime getEffectiveTime(){return effectiveTime;}
public void setEffectiveTime(DateTime ad){effectiveTime=ad;}
public void setId(BigInteger id) {this.id = id;}
public BigInteger getId() {return id;}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
final ConceptPK other = (ConceptPK) obj;
if (effectiveTime == null) {
if (other.effectiveTime != null) return false;
} else if (!effectiveTime.equals(other.effectiveTime)) return false;
if (id == null) {
if (other.id != null) return false;
} else if (!id.equals(other.id)) return false;
return true;
}
@Override
public int hashCode() {
int hash = 3;
hash = 53 * hash + ((effectiveTime == null) ? 0 : effectiveTime.hashCode());
hash = 53 * hash + ((id == null) ? 0 : id.hashCode());
return hash;
}
}
解决方法
要在JPA查询中使用复合主键的一部分,必须使用其变量名称来解决它们:
public Concept findConceptById(BigInteger id) {
Query query = this.em.createQuery("SELECT conc FROM Concept conc WHERE conc.conceptPK.id =:cid order by conc.conceptPK.effectiveTime desc");
query.setParameter("cid",id);
return (Concept) query.getSingleResult();
}
我使用Concept作为实体名称,假设具有@Entity注释的类也被命名为Concept. This question包含有关类似问题的信息,您可能会发现它很有用. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
