2011-01-20 57 views
1

我已經使用Netbeans生成實體類。 我的類有一個複合主鍵,所以Netbeans爲我生成了一個額外的PK實體類。 我希望在Entity類中使用NamedQuery,但由於傳遞給名爲查詢的參數是嵌入在PK類中的,因此NamedQuery調用失敗,查詢看起來不完整。JPA NamedQueries與PK實體

任何人都可以提供一個例子,我的代碼應該看起來像使用NamedQuery它有一個組合PK(@EmbeddedId關聯)嗎?下面失敗:

門面類(部分):

@Stateless 
public class EMyEntityFacade extends AbstractFacade<EMyEntity> { 

public EMyEntityFacade() { 
    super(EMyEntity.class); 
} 

//does not work 
/* 
private Query queryByComp1Id(int comp1Id) { 
    Query query = this.getEntityManager().createNamedQuery("EMyEntity.findByComp1Id"); 
    query.setParameter("comp1Id", comp1Id); 
    return query; 
} 
*/ 

//any nearer? 
private Query queryByComp1d(int comp1Id) { 
    EMyEntityPK eMyEntityPK = new EMyEntityPK(); 

    Query query = this.getEntityManager().createNamedQuery("EMyEntity.findByComp1Id"); 

    eMyEntityPK.setComp1Id(comp1Id); 

    //how do I pass the eMyEntityPK through to the Entity so the query is well formed? 
    //??? 

    return query; 
} 

public List<EMyEntity> findByComp1Id(int comp1Id) { 
    Query query = queryByComp1Id(comp1Id); 
    return query.getResultList(); 
} 

實體類(部分):

@Entity 
@Table(name = "my_entity") 
@NamedQueries({ 
    @NamedQuery(name = "EMyEntity.findByComp1Id", 
    query = "SELECT e FROM EMyEntity e WHERE e.eMyEntityPK.comp1Id = :comp1Id"),...)}) 

public class EMyEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected EMyEntityPK eMyEntityPK; 
    @Basic(optional = false) 
    @Column(name = "inherit_from_parent") 
    ... 
    ... 
} 

PK類(部分):

@Embeddable 
public class EMyEntityPK implements Serializable { 
    @Basic(optional = false) 
    @Column(name = "comp1_id") 
    private int comp1Id; 
    @Basic(optional = false) 
    @Column(name = "comp2_id") 
    private int comp2Id; 
    ... 
    ... 
} 
+0

什麼是錯誤? – Bozho 2011-01-20 18:50:55

+0

顯示異常和堆棧跟蹤 – Bozho 2011-01-21 13:27:29

回答

1

你應該通過誰代表主鍵的對象,而不僅僅是它的一個字段。如果您需要查詢部分pk,請在where子句中引用它:where pk.fld=