2010-06-29 38 views
3

我想用集合函數編寫一個簡單的HQL查詢並獲取錯誤。請幫忙。Java和Hibernate - HQL集合別名

我有3個實體秩序,OrderItem的與產品有如下關係:

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

在較高水平,客戶可以將具有與每個行項目的多個訂單行項目指的是產品的訂購和它的數量。產品就像代表產品目錄的主表一樣。

我正在嘗試查找所有訂購商品中爲每件商品訂購的總數量。我使用下面的查詢:

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

我走樣的s1的總和()函數,這樣我可以用相同的排序。但是這個別名s1似乎造成了一個問題。下面是在休眠調試日誌中的錯誤:

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 

回答

3

如果你看一下,Hibernate對已經生成的SQL,你會看到它忽略了你的別名,並使用它自己的。

相反,只需你使用在選擇

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

聚合函數相同的聚合團不與別名

工作