1

当我执行以下 Native sql hibernate application 时,我收到 java.sql.SQLException: Invalid column name 。我正在使用 Oracle 11g 。我也有包含以下列的 Employee 表。

代码

这是映射文件。

<!-- employee.hbm.xml -->




<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="Employee" table="Employee">
        <id name="empNumber" column="EMPLOYEE_NUMBER "></id>
        <property name="empName"`enter code here` column="EMPLOYEE_NAME"></property>
        <property name="empSal" column="EMPLOYEE_SALARY"></property>
        <property name="deptNumber" column="DEPT_NUMBER"></property>
    </class>
</hibernate-mapping>

//NativeSQLClient.java

import java.util.Iterator;
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.cfg.Configuration;

public class NativeSQLClient {
    @SuppressWarnings("unchecked")
    public static void main(String[] ars) {
        Session session = new Configuration().configure().buildSessionFactory()
                .openSession();
        SQLQuery query = session.createSQLQuery("select * from Employee");
        query.addEntity(Employee.class);
        List li = query.list();
        Iterator iterator = li.iterator();
        System.out.println("============================");
        while (iterator.hasNext()) {
            Employee employee = (Employee) iterator.next();
            System.out.println(employee.getEmpName() + "  "
                    + employee.getEmpNumber() + "  " + employee.getDeptNumber()
                    + "  " + employee.getEmpSal());

        }

    }
}

引发异常

log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select * from Employee
Exception in thread "main" org.hibernate.exception.GenericJDBCException: could not execute query
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:103)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:91)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    at org.hibernate.loader.Loader.doList(Loader.java:2214)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2095)
    at org.hibernate.loader.Loader.list(Loader.java:2090)
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
    at NativeSQLClient.main(NativeSQLClient.java:14)
Caused by: java.sql.SQLException: Invalid column name
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:110)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:171)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:227)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:439)
    at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3352)
    at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1883)
    at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:424)
    at org.hibernate.type.StringType.get(StringType.java:18)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:163)
    at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:154)
    at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1088)
    at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:553)
    at org.hibernate.loader.Loader.doQuery(Loader.java:689)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    at org.hibernate.loader.Loader.doList(Loader.java:2211)
    ... 7 more
4

1 回答 1

3

问题来了,因为列名的最后一个字符有空格:

<id name="empNumber" column="EMPLOYEE_NUMBER "></id>

最有可能的列名EMPLOYEE_NUMBER没有额外的空格。

于 2013-05-26T17:52:36.763 回答