Hibernate问题 - 列名无效

时间:2013-06-24 22:43:09

标签: java oracle hibernate

我在sql中添加了两列来通过hibernate获取值。我的数据库是oracle,那些字段数据类型为i。所以我用long创建了bean(也试过了Integer)但是在检索值时(执行valuesquery)。

它给我一个错误

org.hibernate.type.LongType - could not read column value from result set
java.sql.SQLException: Invalid column name
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3711)
    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:2806)
    at oracle.jdbc.driver.OracleResultSet.getLong(OracleResultSet.java:444)
    at weblogic.jdbc.wrapper.ResultSet_oracle_jdbc_driver_OracleResultSetImpl.getLong(Unknown Source)
    at org.hibernate.type.LongType.get(LongType.java:28)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:189)

tABLE DEFINITION:

    CREATE TABLE "PRODUCTLIST"
(
   PRICELIST_PUBLISH_KEY decimal(22) NOT NULL,
   PRODUCT_NBR varchar2(54) NOT NULL,
   PRODUCT_KEY decimal(22),
   PRODUCT_DESCRIPTION varchar2(360),
   PRODUCT_FAMILY_NBR varchar2(30),
   PRODUCT_FAMILY_DESCR varchar2(180),
   PRODUCT_GROUP_NBR varchar2(30),
   PRODUCT_GROUP_DESCR varchar2(180),
   PRODUCT_LINE_NBR varchar2(30),
   PRODUCT_LINE_DESCR varchar2(180),
   PRODUCT_CLASS_CODE varchar2(6),
   LAST_PP_GENERATED_DATE_KEY decimal(22),
   LAST_PP_GENERATED_DATE date,
   PUBLISH_PERIOD_KEY decimal(22) NOT NULL,
   PUBLISH_PERIOD_DATE date,
   PL_KEY decimal(22),
   PRODUCTLIST varchar2(750),
   SALES_KEY decimal(22),
   PRODUCT varchar2(60),
   DM_EXTRACTED_BY_USER varchar2(90)
)

sql:

        Query query =  session.createSQLQuery(channelQuery)
                                   .addScalar("PRODUCT",Hibernate.STRING)
                                 .addScalar("PRODUCTLIST",Hibernate.STRING)
                                 .addScalar("PRODUCTKEY",Hibernate.LONG)
                                 .addScalar("SALESKEY",Hibernate.LONG)
                           .setResultTransformer(Transformers.aliasToBean(SearchResult.class));          
               return query.list();
             }
  }); 

请帮我解决这个问题?

1 个答案:

答案 0 :(得分:3)

在您的表格定义中,我无法在addScalar()方法中看到您使用的所有字段:没有PRODUCTKEYSALESKEY字段。相反,我可以看到PRODUCT_KEYSALES_KEY字段(下划线)。我认为您应该使用addScalar()方法中字段的正确名称。

但如果您的查询是您在评论中提出的查询,则必须更正一些细节:

  1. 您应该使用 p 代替 pub 作为表名的别名。由于查询中只有一个表,因此可以禁止别名。
  2. SELECT条款中,p.productprice 不是表格中的现有字段。也许您想要使用p.pricelist代替。
  3. WHERE条款中,p.productnbr 不是表格中的现有字段。您应该使用p.product_nbr代替。
  4. 然后,您应该更改addScalar()方法中的字段名称,以匹配您在查询中使用的字段名称。
  5. 修改后的查询

    SELECT distinct p.product, p.productlist, p.PL_KEY, p.SALES_KEY
    FROM productlist p
    WHERE p.product_nbr in ('1002102')
    

    您的代码应为:

    Query query =  session.createSQLQuery(channelQuery)
        .addScalar("PRODUCT",Hibernate.STRING)
        .addScalar("PRODUCTLIST",Hibernate.STRING)
        .addScalar("PL_KEY",Hibernate.LONG)
        .addScalar("SALES_KEY",Hibernate.LONG)
        .setResultTransformer(Transformers.aliasToBean(SearchResult.class));          
    return query.list();
    

    如果在查询中定义别名,则可以使用别名而不是字段名。例如,使用此查询:

    SELECT distinct p.product, p.productlist, p.PL_KEY as PRODUCTKEY, p.SALES_KEY as SALESKEY
    FROM productlist p
    WHERE p.product_nbr in ('1002102')
    

    您可以使用以下代码(这是您的原始代码):

    Query query =  session.createSQLQuery(channelQuery)
        .addScalar("PRODUCT",Hibernate.STRING)
        .addScalar("PRODUCTLIST",Hibernate.STRING)
        .addScalar("PRODUCTKEY",Hibernate.LONG)
        .addScalar("SALESKEY",Hibernate.LONG)
        .setResultTransformer(Transformers.aliasToBean(SearchResult.class));          
    return query.list();