JPA NamedQueries с сущностями PK - PullRequest
       2

JPA NamedQueries с сущностями PK

1 голос
/ 20 января 2011

Я сгенерировал классы сущностей, используя Netbeans. У моего класса есть составной первичный ключ, поэтому Netbeans сгенерировал для меня дополнительный класс сущностей PK. Я хочу использовать NamedQuery в классе Entity, но поскольку параметр, который я передаю в именованный запрос, встроен в класс PK, вызов NamedQuery завершается неудачно, и запрос кажется не завершенным.

Может ли кто-нибудь предложить пример того, как должен выглядеть мой код, чтобы использовать 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")
    ...
    ...
}

ПК класс (часть):

@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;
    ...
    ...
}

1 Ответ

1 голос
/ 20 января 2011

Вы должны передать объект who, представляющий первичный ключ, а не только одно его поле.Если вам нужно запросить часть pk, просим обратиться к нему в предложении where: where pk.fld=

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...