【问题标题】:Hibernate issue - Invalid column name休眠问题 - 列名无效
【发布时间】:2013-06-24 22:43:09
【问题描述】:

我在 sql 中添加了两列以通过 hibernate 获取值。我的数据库是 oracle,这些字段的数据类型为 i 编号。所以我用 long 和(也尝试过 Integer)创建了 bean,但是在检索值时(执行 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)

表定义:

    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();
             }
  }); 

请帮我解决问题?

【问题讨论】:

  • 请向我们展示表定义 (CREATE TABLE ...) 和您正在运行的实际查询。
  • SELECT distinct p.product, p.productprice, p.PL_KEY, p.SALES_KEY FROM productlist pub WHERE p.productnbr in ('1002102') which is running in toad ,但同时通过休眠模式运行我一个错误,列名无效。
  • 你是否使用休眠执行此查询?用 sql 吗?
  • 特别是在添加字段“p.PL_KEY,p.SALES_KEY”之后,它会出错。在没有错误之前。这两个字段的数据类型是oracle中的数字。
  • 我期待休眠

标签: java oracle hibernate


【解决方案1】:

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

但如果您的查询是您放入 cmets 的查询,您必须更正一些细节:

  1. 您应该使用 p 而不是 pub 作为表名的别名。由于查询中只有一张表,您可以隐藏别名。
  2. 在您的SELECT 子句中,p.productprice 不是您表中的现有字段。也许您想改用p.pricelist
  3. 在您的WHERE 子句中,p.productnbr 不是您表中的现有字段。您应该改用p.product_nbr
  4. 然后您应该更改addScalar() 方法中的字段名称以匹配您在查询中使用的名称。

修改后的查询

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();

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多