2013-10-18 141 views
0

我使用下面的HQL:相關子查詢SELECT子句

select new map(hdr.order_number as order_number, (select count(dtl) from OrderDetail dtl where dtl.user_doc_id=hdr.user_doc_id AND dtl.status <> 'Cancelled') as activeRowCount) from OrderHeader hdr where hdr.user_doc_id in ('PO1')

沒有OrderHeader和的OrderDetail之間定義的關聯。當上述查詢正在執行時,出現以下錯誤:

Caused by: org.hibernate.QueryException: could not resolve property: user_doc_id of: OrderHeader [select new map(hdr.order_number as order_number,(select count(dtl) from OrderDetail dtl where dtl.user_doc_id=hdr.user_doc_id AND dtl.status <> 'Cancelled') as activeRowCount) from OrderHeader hdr where hdr.user_doc_id in ('PO00000 
1')] 
     at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
     at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
     at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1451) 
     at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:312) 
     at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487) 
     at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611) 
     at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263) 
     at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210) 
     at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117) 
     at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113) 
     at org.hibernate.hql.ast.tree.DotNode.resolveSelectExpression(DotNode.java:674) 
     at org.hibernate.hql.ast.HqlSqlWalker.resolveSelectExpression(HqlSqlWalker.java:877) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2049) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.aliasedSelectExpr(HqlSqlBaseWalker.java:2229) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.constructor(HqlSqlBaseWalker.java:2419) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:2116) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1981) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1513) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:584) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:292) 
     at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:235) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185) 
     at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
     at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
     at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98) 
     at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
     at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
     at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760) 
     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:914) 
     at org.springframework.orm.hibernate3.HibernateTemplate$30.doInHibernate(HibernateTemplate.java:1) 
     at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:406) 
     ... 88 more 

我無法理解我出錯了。有人可以幫忙嗎?

+0

當我執行在DB相應的SQL,它工作正常: SELECT hdr.order_number AS ORDER_NUMBER, (SELECT COUNT(*)FROM DTL ao_po_detail WHERE = dtl.user_doc_id hdr.user_doc_id AND dtl.business_status <> '已取消' )AS activeRowCount FROM ao_po_header HDR WHERE hdr.user_doc_id IN('PO000001 ') – PrasanthNath

回答

0

我使用貼圖作爲休眠實體模式的主鍵列。所以屬性名稱區分大小寫。我的屬性名稱是USER_DOC_ID地方,因爲我使用user_doc_id因此Hibernate的抱怨: 「無法解析屬性:的user_doc_id:OrderHeader」

0

下面的查詢應該可以工作。只需更換hdr1.id與爲準表如果沒有ID

select new map(
hdr.order_number as order_number, 
(select count(dtl) from OrderHeader hdr1 join OrderDetail dtl on dtl.user_doc_id=hdr1.user_doc_id AND dtl.status <> 'Cancelled' AND hdr1.id = hdr.id) as activeRowCount) 
from OrderHeader hdr where hdr.user_doc_id in ('PO1') 
+0

指定兩個實體之間沒有關聯。那麼在HQL中加入工作而不需要在實體之間定義任何關聯?在建議的查詢中是不是也有不必要的額外連接? –

+0

@Avinash ..如果沒有定義關聯,連接將不起作用。 – PrasanthNath

+0

@ Pratik ..這是工作,甚至不需要額外的加入建議。我們對Hibernate使用MAP實體模式,因此屬性名稱區分大小寫。 hbm文件中定義的屬性名稱是USER_DOC_ID,因爲我使用的是user_doc_id。這是造成這個問題的原因。 – PrasanthNath