2013-06-26 8 views
7

Sto utilizzando Hibernate 3.2.5 per la mia applicazione.Lancio SQL nativo Eccezione nome colonna non valido

Ho una tabella Dept e una tabella 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; 

file di mapping HBM

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

Di seguito si riporta il codice per 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()); 

io sono sempre l'eccezione:

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 

Quando eseguo la query direttamente nel db, poi io sono sempre l'uscita corretta, ma in ibernazione, sta dando un Invalid COlumn name. Ho confermato che i nomi delle colonne sono solo corretti.

Gentilmente fammi sapere come risolvere questo problema.

+0

E dove è il vostro mappatura per classe 'Employees'? – Andremoniy

+1

Manca la tua query 'DEPT_NAME' –

+0

Perché questo tipo di comportamento? Cosa succede se si tratta di un grande tavolo con un sacco di colonne in cui ho bisogno di alcune delle colonne per il mio scopo? In quel caso devo anche aggiungere tutti i nomi delle colonne? Si prega di spiegare. – user182944

risposta

8

avete questo nella vostra mappatura:

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

, ma non esiste una colonna in SQL tra Select e from:

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

Hibernate non ha possibilitys per legare l'attributo. provare con questo:

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

Perché questo tipo di comportamento? Cosa succede se si tratta di un grande tavolo con un sacco di colonne in cui ho bisogno di alcune delle colonne per il mio scopo? In quel caso devo anche aggiungere tutti i nomi delle colonne? Si prega di spiegare. – user182944

+1

In questo caso è possibile utilizzare "seleziona * da" –

+1

Cosa succede se ho bisogno di alcuni di essi e non tutti? È un disadv di SQL nativo su HQL o criteri? – user182944

1

Ho avuto lo stesso problema.

Il motivo è che il nome della colonna nell'annotazione non è corretto.

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

dovrebbe essere cambiata a

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