2012-09-27 20 views
5

içinde hazırda bekletilmedi. Tüm adlandırılan parametreler olarak ayarlanmadı hatası alıyorum. Aşağıda benim kodum.tüm adlandırılmış parametreler, createSQLQuery

MySQL isteminde iyi çalışıyor

benim sqlquery, Söz konusu şema başvurabilir SQL Query Aşağıda

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

benim java kodu i

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) 
alıyorum istisna

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 

Şimdiden teşekkürler ...

cevap

13

Sorun, standart SQL içermeyen := numaralı ödevlerdir. :'dan sonra SQL'de her zaman where value = :param gibi bir parametre bekleniyor ve param parametresi olarak ayarlanmış demektir. Şimdi hazırda beklet, seçim parametrelerini takip etmeyen seçkisini taramakta ve kolonları bulmaktadır.

Çözüm: Hazırda bekletme standartlarını kullanarak seçiminizi yeniden tasarlayın.

İki farklı HQL sorgusu kullanabilirsiniz.

İlk: select distinct product from Table1

İkincisi:: Eğer from Table1 where product = :prod yapmak her bir ürün için: Tüm ürün seçin gerçek ürün ile bir parametre olarak belirlenen eşya ve setMaxResults ile (2) Eğer satır sayısını olarak sınırlayabilir ihtiyacın var.

Şimdi tek bir seçim değil, birçok seçenektir, ancak yine de tek bir sorgudan daha hızlı olabilirler (tek sorgu karmaşıktır ve veritabanında etkin olmayan arama stratejisini riskler). Ve büyük bir avantaj, şimdi tamamen HQL ve bu yüzden programınız farklı veritabanlarına taşınabilir.