2011-01-20 4 views
1

J'ai généré des classes d'entités en utilisant Netbeans. Ma classe a une clé primaire composite, donc Netbeans a généré une classe d'entité PK supplémentaire pour moi. Je souhaite utiliser un NamedQuery dans la classe Entity mais comme le paramètre que je passe dans la requête nommée est Embedded dans la classe PK, l'appel NamedQuery échoue et la requête ne semble pas être complète.JPA NamedQueries avec entités PK

Quelqu'un peut-il donner un exemple de ce à quoi mon code devrait ressembler pour utiliser une NamedQuery qui a un PK composite (association @EmbeddedId)? Ce qui suit échoue:

classe Façade (partie):

@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(); 
} 

classe entité (partie):

@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") 
    ... 
    ... 
} 

classe PK (partie):

@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

Quelle est l'erreur? – Bozho

+0

montre l'exception et le stacktrace – Bozho

+0

Je ne vois aucune erreur. La requête nommée est ok. Où avez-vous des problèmes? –

Répondre

1

Vous devez passer l'objet who représentant la clé primaire, pas seulement un champ de celle-ci. Si vous avez besoin de faire une requête pour une partie de la commande pk, faites-la symétriquement dans la clause where: where pk.fld=

+0

Merci Bozho, pouvez-vous éventuellement poster un exemple de code s'il vous plaît? Le NamedQuery a déjà le 'WHERE e.eMyEntityPK.comp1Id =: comp1Id' dans sa clause where. Je vous remercie. – JPC

+0

Montrez-moi votre requête et votre entité, et l'objet pk – Bozho

Questions connexes