2013-06-26 24 views
7

Tôi đang sử dụng Hibernate 3.2.5 cho ứng dụng của mình.SQL gốc ném Tên cột không hợp lệ Ngoại lệ

Tôi có bảng Dept và bảng Employees.

Dept.java

private int deptId; 
private String deptName; 
private Map empMap = new HashMap(); 
//Getters and Setters 

Employees.java

private int empId; 
private String empName; 
private int deptId; 
private int age; 
private String sex; 
private Dept dept; 

tập tin HBM Mapping

<class name="com.jdbc.Dept" table="dept"> 
    <id name="deptId" type="integer" column="DEPT_ID"> 
     <generator class="assigned"></generator> 
    </id> 
    <property name="deptName"> 
     <column name="DEPT_NAME"></column> 
    </property>  
    <map name="empMap" inverse="false" cascade="all" lazy="true"> 
     <key column="DEPT_ID"></key> 
     <map-key formula="EMP_ID" type="integer"></map-key> 
     <one-to-many class="com.jdbc.Employees"/> 
    </map> 

Dưới đây là mã cho SQL Native:

SQLQuery query = session.createSQLQuery("Select d.DEPT_ID, e.EMP_NAME from Dept d,Emp e where d.DEPT_ID = e.DEPT_ID") 
       .addEntity(Dept.class); 
List<Dept> departments = query.list(); 
     for(Dept depart :departments) 
      System.out.println(depart.getDeptName()); 

Tôi nhận được ngoại lệ:

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:2223) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
at org.hibernate.loader.Loader.list(Loader.java:2099) 
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 com.jdbc.HibernateStartup.main(HibernateStartup.java:75) 
Caused by: java.sql.SQLException: Invalid column name 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:207) 
at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3295) 
at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java:1913) 
at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java:1514) 
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.type.AbstractType.hydrate(AbstractType.java:81) 
at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2096) 
at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1380) 
at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1308) 
at org.hibernate.loader.Loader.getRow(Loader.java:1206) 
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:580) 
at org.hibernate.loader.Loader.doQuery(Loader.java:701) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236) 
at org.hibernate.loader.Loader.doList(Loader.java:2220) 
... 7 more 

Khi tôi chạy truy vấn trực tiếp trong db, sau đó tôi nhận được kết quả đúng nhưng trong hibernate, nó đang đưa ra một Invalid COlumn name. Tôi đã xác nhận rằng các tên cột chỉ đúng.

Vui lòng cho tôi biết cách khắc phục vấn đề này.

+0

Và đâu là bản đồ của bạn cho lớp 'Employees'? – Andremoniy

+1

Truy vấn của bạn thiếu 'DEPT_NAME' –

+0

Tại sao loại hành vi này? Nếu nó là một bảng lớn với nhiều cột, nơi tôi cần một số cột cho mục đích của tôi? Trong trường hợp đó tôi cũng phải thêm tất cả các tên cột? Vui lòng giải thích. – user182944

Trả lời

8

bạn có điều này trong bản đồ của bạn:

<column name="DEPT_NAME"></column> 

nhưng không có cột như vậy trong sql của bạn giữa Selectfrom:

session.createSQLQuery("Select d.DEPT_ID, e.EMP_NAME from Dept d,Emp e where d.DEPT_ID = e.DEPT_ID") 

Hibernate không có possibilitys để ràng buộc các thuộc tính. Hãy thử với điều này:

session.createSQLQuery("Select d.DEPT_ID, d.DEPT_NAME, e.EMP_NAME from Dept d,Emp e where d.DEPT_ID = e.DEPT_ID") 
+0

Tại sao loại hành vi này? Nếu nó là một bảng lớn với nhiều cột, nơi tôi cần một số cột cho mục đích của tôi? Trong trường hợp đó tôi cũng phải thêm tất cả các tên cột? Vui lòng giải thích. – user182944

+1

Trong trường hợp này, bạn có thể sử dụng "select * from" –

+1

Nếu tôi cần một số trong số đó và không phải tất cả? Nó có phải là một disadv của SQL bản địa trên HQL hoặc tiêu chuẩn? – user182944

1

Tôi gặp vấn đề tương tự.

Lý do là tên cột của tôi trong chú thích là không chính xác.

@Column(name = "CUSTOMER_NAME", length = 200) 

nên được thay đổi để

@Column(name = "CUST_NM", length = 200)