2012-09-27 21 views
5

Viene visualizzato l'errore di , non tutti i parametri con nome sono stati impostati. Di seguito è il mio codice.non tutti i parametri con nome sono stati impostati per l'ibernazione in createSQLQuery

mia sqlquery che sta funzionando benissimo al prompt di MySQL, è possibile consultare lo schema in questione 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 

mio codice 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(); 
      } 

Di seguito è riportato l'eccezione sto ottenendo

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) 

Grazie in anticipo ...

risposta

13

Il problema sono i compiti con , che non sono, tra l'altro, standard SQL.

In SQL dopo un : è sempre previsto un parametro, come in where value = :param e: il parametro deve essere impostato come parametro quindi. Ora l'ibernazione sta analizzando i due punti di selezione e di ricerca in cui non seguono i parametri impostati.

Soluzione: riprogettare la selezione utilizzando gli standard di ibernazione.

È possibile utilizzare due diverse query HQL.

Prima: Seleziona tutti i prodotti: select distinct product from Table1

Secondo: Per ogni prodotto che fai from Table1 where product = :prod,: prod si imposta come parametro con il prodotto reale, e con setMaxResults (2) è possibile limitare il numero di righe come hai bisogno.

Ora sono molte selezioni e non una singola, ma tuttavia potrebbero essere più veloci della singola query (la singola query è complicata e rischia una strategia di ricerca inefficiente nel database). E un grande vantaggio, ora è puramente HQL e quindi il tuo programma è trasferibile su diversi database.

Problemi correlati