语句:inlist=session.createQuery("select inr.id,inr.product.name ,inr.client.name as cm,inr.storeroom.name as rm from Storein inr").list();
执行报错:org.hibernate.QueryException: , expected in SELECT [select inr.id,inr.product.name ,inr.client.name as cm,inr.storeroom.name as rm from zou.Storein inr]
at org.hibernate.hql.classic.SelectParser.token(SelectParser.java:175)
at org.hibernate.hql.classic.ClauseParser.token(ClauseParser.java:86)
at org.hibernate.hql.classic.ClauseParser.end(ClauseParser.java:113)
at org.hibernate.hql.classic.PreprocessingParser.end(PreprocessingParser.java:122)
at org.hibernate.hql.classic.ParserHelper.parse(ParserHelper.java:29)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:191)
at org.hibernate.hql.classic.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:167)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:75)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:54)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:71)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1583)
at test.zouTest.testHql(zouTest.java:31)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
当使用select inr.id,inr.product.name ,inr.client.name as cm,inr.storeroom.name as rm from Storein inr是正确的
Storein类
<hibernate-mapping>
<class name="zou.Storein" schema="dbo"  catalog="StorageProduct" table="t_storein">
<id name="id">
<generator class="native"/>
</id>
<property name="intime" />
<property name="re" />
<!-- 定义表间关系与货物信息表之间多对一关系 -->
<many-to-one name="product" class="zou.Product" column="productid" not-null="true"/><!-- 与客户信息多对一关系 -->
<many-to-one  name="client" column="clientid" not-null="true"/>
<!-- 与库房多对一关系 -->
<many-to-one name="storeroom" column="storerommid" not-null="true"/>
   
      </class>
</hibernate-mapping>

解决方案 »

  1.   

    我也遇到这个错了,select count(*) as count,t.userid,t.username,t.resourceid, t.resourcename  from TfAccessPageViewDO as t   where 1=1 and  t.totalView.id = ?  group by t.userid,t.username,t.resourceid, t.resourcename order by count(*) desc去掉count(*)部分就正确。这代码是从weblogic9升级到10造成的,郁闷呢
      

  2.   

    他们不是一一对应的关系。意思是:count(*)取出的值肯定是一个数字,但是:t.userid,t.username,t.resourceid, t.resourcename他们取出的值就是多个了。这样的话,没办法一一对应了。
      

  3.   

    当用select inr.id,inr.product.name ,inr.client.name as cm,inr.storeroom.name as rm from Storein inr时,Hibernate会把查询出来的字段数据封装到Storein中,然而inr.product,inr.client,inr.storeroom这外关系对象是否实例化?严格地来讲inr.client是空的,如何能inr.client.name呢?把上面定制的字段做一个Storein构造方法,再select new Storein(inr.id,inr.product.name...)试试。当用
    select inr.id,inr.product.name ,inr.client.name as cm,inr.storeroom.name as rm from Storein inr时,有了as它会把字段数据封装到Object对象中,所以不会报错。