2010-05-20 12 views
7

¿Es posible con JPA recuperar instancias de clases sin entidad con consultas nativas?
tengo una clase no-entidad que envuelve dos entidades:Seleccionar no entidades con JPA?

class Wrap{ 
    Entity1 ent1; 
    Entity2 ent2 
} 
@Entity 
class Entity1{ 
    ... 
} 
@Entity 
class Entity2{ 
    ... 
} 

¿Cómo puedo hacer algo por el estilo?

Query q = entityManager.createNativeQuery("native select here"); 
List<Wrap> list = q.getResultList(); 

Respuesta

18

¿Es posible con la APP para recuperar una instancias de una clase no son de entidad con consultas nativas?

No. consultas nativas pueden volver entidades única (si usted les dice a hacerlo pasando el resultClass o una resultSetMapping al método createNativeQuery; si no lo hace, obtendrá colecciones de datos en bruto) .

En JPQL, puede usar expresiones de constructor (SELECT NEW ...) con un constructor que no sea de entidad. Pero esto no es compatible con consultas nativas, tendrás que hacerlo manualmente.

+0

Hola @Pascal Estoy tratando de utilizar expresiones constructor con un constructor no entidad. Mi SQL se ve así: 'SELECCIONE NUEVA com.company.ui.EntityIDKey (c.companyId, c.name) FROM Company c DONDE c.companyId no es nulo y c.name no es nulo y de longitud (trim (c.name)))> 0 ordenar por c.nombre asc' y mi código JPA: 'List companies = getEntityManager(). CreateQuery (sql) .getResultList();' pero termino con un tipo de advertencia de seguridad. ¿Cómo evito esto? –

-1

Creo que encontré la solución. Hay una manera de utilizar la palabra clave NEW al construir la consulta. Lo que hice a resovle este tema:

public List<ProductType> getProductByName(String productName) { 
     String sqlQuery = "select DISTINCT **NEW** project1.ProductType(o.name, o.revision) from Lhproduct o where o.name = :prodname"; 
     Query qry = getEntityManager().**createQuery(sqlQuery);** 
     qry.setParameter("prodname",productName); 
     return qry.getResultList(); 
} 

El ProductType es un objeto no-entidad, un objeto simple llano implementar Serialiabale. Pero necesitas definir el constructor apropiado.

feliz de codificación :-)

Gracias y Saludos, Hari

+1

¡Pero Redfield pide usar el operador NUEVO en la consulta nativa! no jpa consulta. Entonces es posible usar esa consulta como createNativeQuery –

+0

Gracias, pero esa no es la respuesta para la consulta nativa. – ForNeVeR

Cuestiones relacionadas