Pergunta

Estou usando o Eclipselink como o provedor JPA. Além disso, estou usando a seguinte estrutura de herança tabela_per_class

@javax.persistence.Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
@NamedQueries({
    @NamedQuery(name=Parent.QUERY_FIND_ALL, query="SELECT p FROM Parent p")
})
public class Parent {
        // the class code follows here
}

@javax.persistence.Entity 
@NamedQueries({
    @NamedQuery(name=Child.QUERY_FIND_ALL, query="SELECT c FROM Child c")
})

public class Child extends Parent {
        // the class code follows here
}

O problema agora é que eu só quero receber entradas da classe pai. Mas com a consulta nomeada "Selecione P do pai P", também todas as entradas da tabela criança são devolvidas.

O código de seleção ou localização é o seguinte:

public List findWithNamedQuery(String query) {
        return em.createNamedQuery(query).getResultList();
}

Assim, a consulta é o IE o "Selecionar P de Parent P".

Como posso receber apenas as entradas dos pais e nem todas as entradas dessa hierarquia de herança?

Em resumo: como posso deixar todas as entradas infantis intocadas e devolver apenas as entradas dos pais?

Editar 1:
Estou usando o Eclipselink 2.0.1, mas toda vez que tento a solução da AxTAVT através da expressão de tipo, recebo o seguinte erro:

"Invalid Type Expression on [my.domain.Parent].  The class does not have a descriptor, or a descriptor that does not use inheritance or uses a ClassExctractor for inheritance".

Atualizei também para a versão mais recente da versão 2.1.1 do Eclipselink, mas isso não resolve o problema.

Foi útil?

Solução 2

A expressão de tipo em combinação com a herança table_per_class não funciona no Eclipselink 2.1.1, isso parece ser um bug.

Veja também a resposta para JPA 2.0: Exceção de expressão de tipo

Outras dicas

Se a sua versão do Eclipselink suportar o JPA 2.0, você pode escrever

SELECT p FROM Parent p WHERE TYPE(p) = Parent
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top