2010-06-29 6 views
3

J'essaye d'écrire une simple requête HQL avec une fonction d'agrégat et d'obtenir une erreur. S'il vous plaît aider.Java et Hibernate - HQL agrégat alias

J'ai 3 entités Ordre, OrderItem et produit avec les relations suivantes:

Order --> OrderItem (One to many bi-directional) 
OrderItem --> Product (Many to one Uni-directional) 

À un niveau élevé, un client peut passer une commande qui a plusieurs éléments de ligne de commande avec chaque poste faisant référence à un produit et sa quantité. Le produit est comme une table principale représentant le catalogue de produits. J'essaie de trouver la quantité totale commandée pour chaque produit sur tous les articles commandés. J'utilise la requête suivante:

select oi.product.name, sum(oi.quantity) as s1 from OrderItem oi 
group by oi.product.name order by s1 desc 

J'aliasing la fonction somme() avec s1 pour que je puisse trier par le même. Mais cet alias s1 semble créer un problème. Voici l'erreur dans le journal de débogage de mise en veille prolongée:

15:39:56,350 DEBUG SQL:111 - select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc 
Hibernate: select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc 
15:39:56,356 DEBUG JDBCExceptionReporter:92 - could not execute query [select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc] 
java.sql.SQLException: Column not found: S1 in statement [select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc] 
at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source) 
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1577) 
at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.doList(Loader.java:2232) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) 
at org.hibernate.loader.Loader.list(Loader.java:2124) 
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) 
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149) 
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
at com.bpp.cm.ProductRepository.getTopFiveProducts(ProductRepository.java:136) 
at com.bpp.cm.Main.testGetTop5Products(Main.java:315) 
at com.bpp.cm.Main.testProduct(Main.java:233) 
at com.bpp.cm.Main.main(Main.java:40) 
15:39:56,377 WARN JDBCExceptionReporter:100 - SQL Error: -28, SQLState: S0022 
15:39:56,378 ERROR JDBCExceptionReporter:101 - Column not found: S1 in statement [select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc] 
15:39:56,379 DEBUG JDBCTransaction:186 - rollback 
15:39:56,379 DEBUG JDBCTransaction:197 - rolled back JDBC Connection 
15:39:56,379 DEBUG ConnectionManager:427 - aggressively releasing JDBC connection 
15:39:56,380 DEBUG ConnectionManager:464 - releasing JDBC connection [ (open PreparedStatements: 1, globally: 1) (open ResultSets: 0, globally: 0)] 
org.hibernate.exception.SQLGrammarException: could not execute query 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.loader.Loader.doList(Loader.java:2235) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) 
at org.hibernate.loader.Loader.list(Loader.java:2124) 
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) 
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) 
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149) 
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 
at com.bpp.cm.ProductRepository.getTopFiveProducts(ProductRepository.java:136) 
at com.bpp.cm.Main.testGetTop5Products(Main.java:315) 
at com.bpp.cm.Main.testProduct(Main.java:233) 
at com.bpp.cm.Main.main(Main.java:40) 
Caused by: java.sql.SQLException: Column not found: S1 in statement [select product1_.PRODUCT_NAME as col_0_0_, sum(orderitem0_.ORDER_ITEM_QUANTITY) as col_1_0_ from ORDER_ITEM orderitem0_, PRODUCT product1_ where orderitem0_.PRODUCT_ID=product1_.PRODUCT_ID group by product1_.PRODUCT_NAME order by s1 desc] 
at org.hsqldb.jdbc.Util.throwError(Unknown Source) 
at org.hsqldb.jdbc.jdbcPreparedStatement.<init>(Unknown Source) 
at org.hsqldb.jdbc.jdbcConnection.prepareStatement(Unknown Source) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:534) 
at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:452) 
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:161) 
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1577) 
at org.hibernate.loader.Loader.doQuery(Loader.java:696) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
at org.hibernate.loader.Loader.doList(Loader.java:2232) 
... 11 more 

Répondre

3

Si vous regardez le SQL Hibernate a généré, vous verrez qu'il a ignoré votre alias et utilisé son propre.

Au lieu de cela, il suffit de groupe par le même agrégat que vous utilisez dans les sélectionnez

select oi.product.name, sum(oi.quantity) from OrderItem oi group by oi.product.name order by sum(oi.quantity) desc 
0

fonctions d'agrégation ne fonctionne pas avec alias