2012-09-27 2 views
5

Ich bekomme den Fehler nicht alle benannten Parameter wurden gesetzt. Unten ist mein Code.nicht alle benannten Parameter wurden in den Ruhezustand in createSQLQuery gesetzt

meine sqlquery die Geldbuße auf mysql-Eingabeaufforderung ausgeführt wird, können Sie Schema in der Frage beziehen 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 

mein Java-Code

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

Unten ist die Ausnahme, die ich immer bin

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) 

Vielen Dank im Voraus ...

Antwort

13

Das Problem sind die Zuweisungen mit :=, die übrigens kein Standard-SQL sind.

In SQL wird nach einem : immer ein Parameter erwartet, wie in where value = :param und: param muss dann als Parameter gesetzt werden. Der Ruhezustand durchsucht jetzt die Auswahl- und Fund-Doppelpunkte, denen keine Parameter folgen.

Lösung: Redesign Ihre Auswahl mit Hibernate-Standards.

Sie können zwei verschiedene HQL-Abfragen verwenden.

Erstens: alle Produkte auswählen: select distinct product from Table1

Zweitens: Für jedes Produkt, das Sie from Table1 where product = :prod tun,: prod Sie als Parameter mit dem tatsächlichen Produkt gesetzt und mit setMaxResults (2) können Sie die Anzahl der Zeilen begrenzen du brauchst.

Jetzt ist es viele Auswahlen und nicht eine einzige, aber dennoch können sie schneller sein als die einzelne Abfrage (die einzelne Abfrage ist kompliziert und riskiert eine ineffiziente Suchstrategie in der Datenbank). Und ein großer Vorteil, jetzt ist es rein HQL und so ist Ihr Programm zu verschiedenen Datenbanken portierbar.

Verwandte Themen