简体   繁体   English

Hibernate问题 - 列名无效

[英]Hibernate issue - Invalid column name

I have added two columns in the sql to get the values through hibernate.My databse is oracle and those fields datatype i number. 我在sql中添加了两列来通过hibernate获取值。我的数据库是oracle,那些字段数据类型为i。 So i have created the beans with long and (tried Integer too) but when retrieving the values(executing the valuesquery). 所以我用long创建了bean(也试过了Integer)但是在检索值时(执行valuesquery)。

Its giving me an error 它给了我一个错误

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

Please help me to fix the issue ? 请帮我解决这个问题?

In your table definition, I can't see all the fields you're using in the addScalar() methods: there are no PRODUCTKEY nor SALESKEY fields. 在表定义中,我无法在addScalar()方法中看到您正在使用的所有字段:没有PRODUCTKEYSALESKEY字段。 Instead I can see a PRODUCT_KEY and a SALES_KEY fields (underscores). 相反,我可以看到PRODUCT_KEYSALES_KEY字段(下划线)。 I think you should use the correct name of the fields in the addScalar() methods. 我认为你应该使用addScalar()方法中字段的正确名称。

But if your query is the one you put in your comments, you have to correct some details: 但是,如果您的查询是您在评论中添加的查询,则必须更正一些细节:

  1. you should use p instead of pub as alias for the table name . 您应该使用 p 而不是 pub 作为表名的别名 As there is only one table in the query, you can suppress the alias. 由于查询中只有一个表,因此可以抑制别名。
  2. In your SELECT clause, p.productprice is not an existing field in your table . SELECT子句中, p.productprice 不是表中的现有字段 Maybe you want to use p.pricelist instead. 也许你想用p.pricelist代替。
  3. In your WHERE clause, p.productnbr is not an existing field in your table . WHERE子句中, p.productnbr 不是表中的现有字段 You should use p.product_nbr instead. 您应该使用p.product_nbr
  4. Then you should change the field names in the addScalar() methods to match those you are using in the query. 然后,您应该更改addScalar()方法中的字段名称以匹配您在查询中使用的字段名称。

Modified query 修改查询

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

Your code should be: 你的代码应该是:

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

If you define aliases in your query, then you can use the alias names instead of the field names. 如果在查询中定义别名,则可以使用别名而不是字段名。 For example, with this query: 例如,使用此查询:

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')

you can use the following code (it's your original code): 您可以使用以下代码(这是您的原始代码):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM