2012-09-27 14 views
5

Recibo el error no se han establecido todos los parámetros con nombre. A continuación está mi código.no se han establecido todos los parámetros con nombre hibernate en createSQLQuery

mi SQLQuery que está funcionando muy bien en el indicador de MySQL, puede referirse esquema en la cuestión SQL Query

SELECT t.* 
FROM (
    SELECT @lim := 2, 
      @cg := '' 
    ) vars, 
    (select * from Table1 order by product,amount, make) t 
WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 
    AND (@r := @r - 1) >= 0 
    AND (@cg := product) IS NOT NULL 
ORDER BY 
    product,amount, make 

mi código java

try { 
      context.dbl.startTransaction(); 
      Session session = context.dbl.getSession(); 

      //String sqlQuery = "from com.infibeam.inventoryservice.dbObjects.PopularBrandDO"; 
      String sqlQuery = "SELECT t.* "; 
      sqlQuery=sqlQuery + "FROM ("; 
      sqlQuery=sqlQuery + "SELECT @lim := 2,"; 
      sqlQuery=sqlQuery + "@cg := ''"; 
      sqlQuery=sqlQuery + ") vars, "; 
      sqlQuery=sqlQuery + "(select * from Table1 order by product,amount, make) t"; 
      sqlQuery=sqlQuery + " WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0"; 
      sqlQuery=sqlQuery + " AND (@r := @r - 1) >= 0 "; 
      sqlQuery=sqlQuery + " AND (@cg := product) IS NOT NULL "; 
      sqlQuery=sqlQuery + " ORDER BY product,amount, make"; 
      //Query query = session.createQuery(sqlQuery); 
      SQLQuery query = session.createSQLQuery(sqlQuery); 
      listItems = query.list(); 


      }catch(RuntimeException e) { 
       e.printStackTrace(); 
      } 

A continuación se muestra la excepción que estoy recibiendo

org.hibernate.QueryException: Not all named parameters have been set: [] [SELECT t.* FROM (SELECT @lim := 2,@cg := '') vars, (select * from Table1 order by product,amount, make) t WHERE CASE WHEN @cg <> product THEN @r := @lim ELSE 1 END > 0 AND (@r := @r - 1) >= 0 AND (@cg := product) IS NOT NULL ORDER BY product,amount, make] 
    at org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:291) 
    at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:199) 
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:143) 
    at com.infibeam.weaverbird.helper.PopularBrandFacetHelper.bootstrap(PopularBrandFacetHelper.java:48) 

Gracias de antemano ...

Respuesta

13

El problema son las asignaciones con :=, que por cierto no son SQL estándar.

En SQL después de : siempre se espera un parámetro, como en where value = :param y: param tiene que establecerse entonces como un parámetro. Ahora hibernate está escaneando la selección y encuentra dos puntos donde no se siguen los parámetros establecidos.

Solución: rediseñe su selección usando estándares de hibernación.

Puede usar dos consultas HQL diferentes.

Primero: Seleccionar todo el producto: select distinct product from Table1

Segundo: Para cada producto que hace from Table1 where product = :prod,: prod configura como un parámetro con el producto real, y con setMaxResults (2) se puede limitar el número de filas necesitas.

Ahora hay muchas selecciones y ninguna, pero sin embargo pueden ser más rápidas que la consulta individual (la única consulta es complicada y arriesga una estrategia de búsqueda ineficiente en la base de datos). Y una gran ventaja, ahora es puramente HQL, por lo que su programa es portátil para diferentes bases de datos.

Cuestiones relacionadas