Trato de convertir mi consulta SQL en HQL o JPQL (quiero beneficio de la asignación de objetos).

Mi Petición SQL es :

SELECT * 
FROM (SELECT bde, MAX(creation_date) 
      FROM push_campaign GROUP BY bde) temp, 
push_campaign pc where pc.bde = temp.bde and pc.creation_date = temp.creation_date;

Puedo intentar (sin éxito) para convertirlo en JPQL con :

select pc 
from (select bde, max(creationDate) 
      from PushCampaign group by bde) temp, 
PushCampaign pc 
where pc.bde = temp.bde and pc.creationDate = temp.creationDate

Pero tengo planteado :

IllegalArgumentException occured :

org.hibernate.hql.ast.QuerySyntaxException: testigo inesperado: ( cerca de
la línea 1, columna 16 [seleccione pc de (select id, max(campos creationdate) de
modelos.PushCampaign grupo por bde) temp, modelos.PushCampaign pc donde
pc.id = temp.id]

He leído la instrucción select anidada sólo puede estar en seleccionar o la cláusula where.

¿Tiene soluciones para mantener la solicitud y el beneficio del objeto de asignación ?

  • Has probado a utilizar INNER JOIN en lugar de unirse en la WHERE cláusula?
  • He de búsqueda cómo, pero no puedo encontrar ningún ejemplo con subconsulta y innerjoin. Todas las pruebas que he intentado error… Gracias por la sugerencia, me ll cavar en esa dirección
  • No es posible tener subconsultas en una combinación interna en jpql. Sólo es posible en where o having declaraciones….
InformationsquelleAutor iwalktheline | 2011-08-05

3 Comentarios

  1. 3

    este debe lograr resultados similares

    select pc
    from PushCampaign pc 
    where pc.creationDate =
    (select max(creationDate) from PushCampaign inner where inner.bde = pc.bde)
    • En realidad necesito un registro individual para cada población «bde». Su solicitud no se puede permitir. Y, de hecho, diferentes/de una sola población puede tener la misma campos creationdate.
    • su respuesta puede ser la más eficiente, pero mi consulta no devolver un registro para cada bde. Para cada registro de la subconsulta se busca el máximo de la fecha por la actual bde sólo así, el resultado de la subconsulta varía para cada registro, y debe devolver los resultados correctos. Intente.
  2. 3

    Que no es posible con JPQL o HQL en una sola solicitud.

    Para ello en una única solicitud, propongo esto :

    String campaignToLaunch = "select pc.* from PushCampaign pc ..."
    //SQL request which return a resultset compatible with the models.PushCampaign class
    Class className = Class.forName("models.PushCampaign");
    List<PushCampaign> result = JPA.em()
                               .createNativeQuery(campaignToLaunch,className)
                               .getResultList();
  3. 2

    Una solución simple podría ser:

    servlet
    {
        Query q = entityManager.createNativeQuery("SQL");
        List<> li =  q.getResultList();
    
        @PersistenceContext(unitName="UNIT")
        private EntityManager entityManager;
    }

Dejar respuesta

Please enter your comment!
Please enter your name here