这是SQL
SELECT goods.* FROM
(SELECT * FROM yxgl_huodongjiangpin AS hdjp
WHERE hdjp.HDJL_ID = '712e452e-075d-43288981-62804c8cc615') AS jp,
kcgl_goods AS goods 
WHERE jp.GOODS_ID = goods.GOODS_ID;

这是HQL
select goods from
(select hdjp from YxglHuodongjiangpin as hdjp where hdjp.hdjpId=?) as jp,
KcglGoods as goods
where jp.goodsId=goods.goodsId;

执行后的异常,
严重: Servlet.service() for servlet [default] in context with path [/nwmrmf] threw exception [org.springframework.orm.hibernate3.HibernateQueryException: unexpected token: ( near line 1, column 19 [select goods from (select hdjp from com.turing.manage.entity.YxglHuodongjiangpin as hdjp where hdjp.hdjpId=?) as jp,com.turing.manage.entity.KcglGoods as goods where jp.goodsId=goods.goodsId]; nested exception is org.hibernate.hql.ast.QuerySyntaxError: unexpected token: ( near line 1, column 19 [select goods from (select hdjp from com.turing.manage.entity.YxglHuodongjiangpin as hdjp where hdjp.hdjpId=?) as jp,com.turing.manage.entity.KcglGoods as goods where jp.goodsId=goods.goodsId]] with root cause
line 1:19: unexpected token: (
at org.hibernate.hql.antlr.HqlBaseParser.fromRange(HqlBaseParser.java:1200)
at org.hibernate.hql.antlr.HqlBaseParser.fromClause(HqlBaseParser.java:1041)
at org.hibernate.hql.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:759)
at org.hibernate.hql.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:611)
at org.hibernate.hql.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:263)
at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:150)
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:209)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:127)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:83)
at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:427)
at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:884)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:834)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:74)
at com.turing.framework.page.BasicDao$1.doInHibernate(BasicDao.java:77)
请诸位帮我看下我的HQL哪里写的不对,SQL是在数据库里执行是正确的,现在就是HQL的问题!
第一次问问题,送分。求解决,sqlexception

解决方案 »

  1.   

    这种子查询HQL好像不行吧。可能要建立关联。
      

  2.   

    不要把 HQL 当作 SQL 来用,如果是这样的话,那 SQL 不得淘汰了?HQL 肯定可以转换为 SQL,而绝大多数的 SQL 是无法转换成为 HQL 的,正因为如此 Hibernate 也提供了支持原生 SQL 查询的接口!
      

  3.   

    hql不能子查询的,你有没有主外键关系?建了映射关系没?直接用对象调用也可以
      

  4.   

    没有就这样吧from KcglGoods as goods left join YxglHuodongjiangpin as hdjp on goods.goodsId = hdjp.goodsId 
    where hdjp.hdjpId=?
      

  5.   

    this.getHibernateSession().createSQLQuery(sql);
    用原生sql就可以了。
      

  6.   

    from KcglGoods  
    where goodsId in 
    (select goodsId from YxglHuodongjiangpin as hdjp where hdjp.hdjpId='xxxxxxx')
    上面这样貌似效率不好 。
    hibernate有提供createSQLQuery 直接可以用sql来查询 ,具体sql效率请自己优化
    然后在转换成对应的实体 使用
    List list = session.createSQLQuery(sql).setResultTransformer(Transformers.aliasToBean(实体.class)).list()