使用复合主键的SELECT查询

时间:2014-05-05 19:33:20

标签: java sql hibernate jpa

在使用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复合主键的两个属性,因此ConceptPKid的属性定义,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

2 个答案:

答案 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方法。