在使用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();
}
如何更改上述查询,以便返回给定effectiveTime
的最新id
概念?请注意id
和{ {1}}是effectiveTime
复合主键的两个属性,因此ConceptPK
和id
的属性定义,getter和setter位于effectiveTime
类中而不是ConceptPK
类。
以上引发的错误是:
Concept
这是现在在Caused by: java.lang.IllegalArgumentException:
Parameter value [786787679] did not match expected type [myapp.ConceptPK]
类中定义主键的方式:
Concept
以下是private ConceptPK conceptPK;
类的代码:
ConceptPK
答案 0 :(得分:5)
要在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包含有关类似问题的信息,您可能会发现它很有用。
答案 1 :(得分:3)
请试试这个
@SuppressWarnings("unchecked")
public Concept findConceptById(BigInteger id) {
Query query = this.em.createQuery("from Concept conc WHERE conc.conceptPK.id = :cid order by conc.conceptPK.effectiveTime desc");
query.setParameter("cid", id);
return (Concept) query.getSingleResult();
}
确保conceptPK在Concept类中具有getter和setter方法。