我做一个分组查询,用sql查询的,但是查询出来说列名无效。在数据库里运行sql语句是没问题的。
【INFO】2011-02-14 11:57:30  INFO [http-8080-Processor23] (NullableType.java:182) - could not read column value from result set: goodsId; 列名无效【代码】
Session session = HibernateTemplate.getInstance().getSession();
String sql = "select goodsName,status,effective,count(*) as counts from pointgoods group by goodsName,status,effective";
Query query = session.createSQLQuery(sql).addEntity(PointGoodsInfo.class);
List<PointGoodsInfo> queryList = query.list();运行到这就出错了。还有一个关联关系:
<class name="PointGoodsInfo" table="pointgoods">
<id name="goodsId" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">SEQ_pointgoods</param>
</generator>
</id>
<property name="goodsName"></property>
<property name="point"></property>
<property name="status"></property>
<property name="effective"></property>
<property name="pointType"></property>
<property name="counts"></property>

<!-- 配置一对一双向关联 -->
<one-to-one name="pointGoodsCard" 
class="com.cn.project.entity.entity.PointGoodsCard" 
property-ref="pointGoodsInfo" />
</class><class name="PointGoodsCard" table="pointgoodscard">
<id name="cardId" type="java.lang.Long">
<generator class="sequence">
<param name="sequence">SEQ_pointgoodscard</param>
</generator>
</id>
<property name="cardNo"></property>
<property name="cardPassword"></property>
<many-to-one name="pointGoodsInfo" column="goodsId"
class="com.cn.project.entity.PointGoodsInfo" 
unique="true" cascade="all" />
</class>

解决方案 »

  1.   

    应该是代码写的有问题  
    你试一下 :
    String sql = "select goodsName,status,effective,count(*) as counts from pointgoods group by goodsName,status,effective";Query query = session.createSQLQuery(sql).addEntity(PointGoodsInfo.class).addScalar("counts",Hibernate.LONG).addScalar("goodsName",Hibernate.STRING).addScalar("status",Hibernate.STRING).addScalar("effective",Hibernate.STRING);
      

  2.   

    分析!!一个表 
    ID      NAME          PYM      Filter 
    ------  ----------    ------   ---------- 
    0001    总公司          ZGS      0000 
    0002    哈尔滨分公司    HEBFGS   0001 
    。。 等等其他字段 
    我直接写sql进行查询 
    select ID,NAME,PYM,FILTER from DEPARTMENT 当如此查询时: 
    List<Object[]> list = session.createSqlQuery(sql).list(); 
    在循环list看查询结果时,发现每一列都被截短了 
    得到 
    -----   -----   ----- ----- 
    0       总       Z     0 
    当如此查询时: 
    List<Object[]> list = session.createSqlQuery(sql).addScalar("id",Hibernate.STRING).addScalar("label", 
    Hibernate.STRING).addScalar("pym", Hibernate.STRING).addScalar("filter", Hibernate.STRING).list(); 
    循环list的时,得到正常结果
      

  3.   

    还是不行,不分组查询也不行
    我现在这样写:String sql = "select goodsName,status  from pointgoods";
    Query query = session.createSQLQuery(sql).addEntity(PointGoodsInfo.class).addScalar("goodsName",Hibernate.STRING).addScalar("status",Hibernate.INTEGER);
    不分组查询也是报同样的错误,按你的那个写法也是报那个错误,是不是映射文件有问题?
      

  4.   


    还是说列名无效,不过这次是其他列名,每个属性都要用addScalar()这个方法吗?
      

  5.   

    你在你的配置里写上类型啊比如
    <property name="goodsName" type="string"></property>
      

  6.   

    你真的吧所有字段都加上addScalar就对了?
      

  7.   

    先试一下  String sql = "select * from pointgoods pg";
    Query query = session.createSQLQuery(sql).addEntity("pg",PointGoodsInfo.class);如果还是报错,检查一下映射文件
    如果不报错,那就是代码问题
      

  8.   

    我试了没错。我想问的是如果我用以前的select语句:
    String sql = "select goodsName,status,effective,count(*) as counts from pointgoods group by goodsName,status,effective";Query query = session.createSQLQuery(sql).addEntity(PointGoodsInfo.class).addScalar("counts",Hibernate.LONG).addScalar("goodsName",Hibernate.STRING).addScalar("status",Hibernate.STRING).addScalar("effective",Hibernate.STRING);
    List list=query.list();
    我要是进行类型转换的话,list应该是什么类型?应该不是List<PointGoodsInfo> list=query.list();吧?我怎么把list里的内容转换成对象,封装到PointGoodsInfo这个对象中去啊?
      

  9.   

    list里面的对象会是object[4]
    可以手动的处理这个list  封装到List<PointGoodsInfo>
      

  10.   

    我觉得还是我的sql语句有问题,因为它总是报列名无效,could not read column value from result set:某某字段,我就把这个字段加到sql语句的select条件中,结果它又报下一个字段列名无效,我试了好几个DAO表中查询都是这样报错。您看我的sql语句有什么问题?或者我还可以换种方式查询吗?
      

  11.   

    你拿出来查询下不就知道是不是sql语句的错误!
      

  12.   

    在数据库里没错,在程序中就出错。不过我现在用hql语句解决了。我因为不会hql分组查询就用sql的,现在发现hql分组也会了,所以在用hql写
      

  13.   

    弱弱的说一句,hibernate查询是不是可以用对象的方式呀?一个月没碰了,都忘了,诶,得赶紧补补咯!
      

  14.   


    你可以试一下 把查询的字段和表名都加上别名  看看是否可以 例如:
    String sql = "select goodsName gn ,status s from pointgoods pg ";Query query = session.createSQLQuery(sql).addEntity("pg",PointGoodsInfo.class).addScalar("gn",Hibernate.STRING).addScalar("s",Hibernate.INTEGER)