hi all my name is Edson Chavez From Peru, my nick Grubhart
abstract:
i ran same hql query (only select section is different) and one works but another launch exception
Code:
List<Aplicativos> aplicativos = newSession.createQuery("select a from Aplicativos a join a.liberadores l where a.idAplicativo = :idAplicativo and l.empleado.contrata.idContrata = :idContrata").setString("idAplicativo", idAplicativo).setString("idContrata", idContrata).list();
this works i have a list of Aplicativos when i change select section to
Code:
List<LiberadorContrata> liberadores = newSession.createQuery("select l from Aplicativos a join a.liberadores l where a.idAplicativo = :idAplicativo and l.empleado.contrata.idContrata = :idContrata").setString("idAplicativo", idAplicativo).setString("idContrata", idContrata).list();
the database server is sql server 2005
second query fails
hibernate catch:
org.hibernate.exception.GenericJDBCException: could not execute query
sql server launch this exception:
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: El nombre de columna col_0_1_ no es válido.
this say column name col_0_1 is invalid but i can't see this column in generated sql!!!!
my console output show this message
Code:
24-jun-2010 14:06:03 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: col_0_1_; El nombre de columna col_0_1_ no es válido.
24-jun-2010 14:06:03 org.hibernate.util.JDBCExceptionReporter logExceptions
ADVERTENCIA: SQL Error: 0, SQLState: S1093
24-jun-2010 14:06:03 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: El nombre de columna col_0_1_ no es válido.
here the sql generated:
Code:
Hibernate:
select
liberadore1_.idAplicativo as col_0_0_
from
dbo.Aplicativos aplicativo0_
inner join
dbo.ContratasLiberador liberadore1_
on aplicativo0_.idAplicativo=liberadore1_.idAplicativo,
dbo.ContratasEmpleados empleado2_
where
liberadore1_.idEmpleado=empleado2_.idEmpleado
and aplicativo0_.idAplicativo=?
and empleado2_.idContrata=?
i search for 2 days and i don't know what's the problem i really apreciate some hints or help in this error,
next my beans code, dao class and test case used:
Aplicativos.java
Code:
package domain;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.CollectionOfElements;
@Entity
public class Aplicativos {
private String idAplicativo;
private String aplicativo;
private String fechaRegistro;
private String usuarioRegistra;
private String fechaModifica;
private String usuarioModifica;
private String activo;
private List <LiberadorContrata> liberadores = new ArrayList<LiberadorContrata>();
public Aplicativos(){
super();
}
@Id
public String getIdAplicativo() {
return idAplicativo;
}
public void setIdAplicativo(String idAplicativo) {
this.idAplicativo = idAplicativo;
}
public String getAplicativo() {
return aplicativo;
}
public void setAplicativo(String aplicativo) {
this.aplicativo = aplicativo;
}
public String getFechaRegistro() {
return fechaRegistro;
}
public void setFechaRegistro(String fechaRegistro) {
this.fechaRegistro = fechaRegistro;
}
public String getUsuarioRegistra() {
return usuarioRegistra;
}
public void setUsuarioRegistra(String usuarioRegistra) {
this.usuarioRegistra = usuarioRegistra;
}
public String getFechaModifica() {
return fechaModifica;
}
public void setFechaModifica(String fechaModifica) {
this.fechaModifica = fechaModifica;
}
public String getUsuarioModifica() {
return usuarioModifica;
}
public void setUsuarioModifica(String usuarioModifica) {
this.usuarioModifica = usuarioModifica;
}
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
@CollectionOfElements(fetch = FetchType.EAGER)
@JoinTable (name="ContratasLiberador", joinColumns = @JoinColumn(name = "idAplicativo"))
public List<LiberadorContrata> getLiberadores() {
return liberadores;
}
public void setLiberadores(List<LiberadorContrata> liberadores) {
this.liberadores = liberadores;
}
}
LiberadorContrata.java
Code:
package domain;
import javax.persistence.*;
import org.hibernate.annotations.Parent;
@Embeddable
public class LiberadorContrata {
private Aplicativos aplicativo;
private Empleado empleado;
private String fechaRegistro;
private String usuarioRegistra;
private String fechaModifica;
private String usuarioModifica;
private String activo;
@Parent
public Aplicativos getAplicativo() {
return aplicativo;
}
public void setAplicativo(Aplicativos aplicativo) {
this.aplicativo = aplicativo;
}
@ManyToOne
@JoinColumn(name = "idEmpleado", nullable= false, updatable= false)
public Empleado getEmpleado() {
return empleado;
}
public void setEmpleado(Empleado empleado) {
this.empleado = empleado;
}
@Column
public String getFechaRegistro() {
return fechaRegistro;
}
public void setFechaRegistro(String fechaRegistro) {
this.fechaRegistro = fechaRegistro;
}
@Column
public String getUsuarioRegistra() {
return usuarioRegistra;
}
public void setUsuarioRegistra(String usuarioRegistra) {
this.usuarioRegistra = usuarioRegistra;
}
@Column
public String getFechaModifica() {
return fechaModifica;
}
public void setFechaModifica(String fechaModifica) {
this.fechaModifica = fechaModifica;
}
@Column
public String getUsuarioModifica() {
return usuarioModifica;
}
public void setUsuarioModifica(String usuarioModifica) {
this.usuarioModifica = usuarioModifica;
}
@Column
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
}
Empleado.java
Code:
package domain;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
@Entity
@Table (name="ContratasEmpleados")
public class Empleado {
private String idEmpleado;
private String empleado;
private String password;
private String mail;
private String fechaRegistra;
private String usuarioRegistra;
private String fechaModifica;
private String usuarioModifica;
private String activo;
private Contratas contrata;
public Empleado(){
super();
}
@Id
public String getIdEmpleado() {
return idEmpleado;
}
public void setIdEmpleado(String idEmpleado) {
this.idEmpleado = idEmpleado;
}
public String getEmpleado() {
return empleado;
}
public void setEmpleado(String empleado) {
this.empleado = empleado;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getMail() {
return mail;
}
public void setMail(String mail) {
this.mail = mail;
}
public String getFechaRegistra() {
return fechaRegistra;
}
public void setFechaRegistra(String fechaRegistra) {
this.fechaRegistra = fechaRegistra;
}
public String getUsuarioRegistra() {
return usuarioRegistra;
}
public void setUsuarioRegistra(String usuarioRegistra) {
this.usuarioRegistra = usuarioRegistra;
}
public String getFechaModifica() {
return fechaModifica;
}
public void setFechaModifica(String fechaModifica) {
this.fechaModifica = fechaModifica;
}
public String getUsuarioModifica() {
return usuarioModifica;
}
public void setUsuarioModifica(String usuarioModifica) {
this.usuarioModifica = usuarioModifica;
}
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
@ManyToOne
@JoinColumn (name="idContrata", nullable=false)
public Contratas getContrata() {
return contrata;
}
public void setContrata(Contratas contrata) {
this.contrata = contrata;
}
}
Contratas.java
Code:
package domain;
import javax.persistence.*;
@Entity
public class Contratas {
private String idContrata;
private String contrata;
private String fechaRegistro;
private String usuarioRegistra;
private String fechaModifica;
private String usuarioModifica;
private String activo;
private String idSociedad;
public Contratas(){
super();
}
@Id
public String getIdContrata() {
return idContrata;
}
public void setIdContrata(String idContrata) {
this.idContrata = idContrata;
}
public String getContrata() {
return contrata;
}
public void setContrata(String contrata) {
this.contrata = contrata;
}
public String getFechaRegistro() {
return fechaRegistro;
}
public void setFechaRegistro(String fechaRegistro) {
this.fechaRegistro = fechaRegistro;
}
public String getUsuarioRegistra() {
return usuarioRegistra;
}
public void setUsuarioRegistra(String usuarioRegistra) {
this.usuarioRegistra = usuarioRegistra;
}
public String getFechaModifica() {
return fechaModifica;
}
public void setFechaModifica(String fechaModifica) {
this.fechaModifica = fechaModifica;
}
public String getUsuarioModifica() {
return usuarioModifica;
}
public void setUsuarioModifica(String usuarioModifica) {
this.usuarioModifica = usuarioModifica;
}
public String getActivo() {
return activo;
}
public void setActivo(String activo) {
this.activo = activo;
}
public String getIdSociedad() {
return idSociedad;
}
public void setIdSociedad(String idSociedad) {
this.idSociedad = idSociedad;
}
}
this class run hql querys
AplicativosDaoImpl
Code:
package dao.impl;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import org.hibernate.Session;
import org.hibernate.Transaction;
import dao.AplicativosDao;
import domain.Aplicativos;
import domain.Empleado;
import domain.LiberadorContrata;
import com.hochschild.util.HibernateUtil;
public class AplicativosDaoImpl implements AplicativosDao {
public Aplicativos[] getAllAplicativos(){
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
Aplicativos[] aplicativos = (Aplicativos[]) newSession.createQuery("from Aplicativos").list().toArray(new Aplicativos[0]);
newTransaction.commit();
newSession.close();
HibernateUtil.shutdown();
return aplicativos ;
}
public List<Aplicativos> getAplicativos( String idAplicativo, String idContrata){
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
List<Aplicativos> aplicativos = newSession.createQuery("select a from Aplicativos a join a.liberadores l where a.idAplicativo = :idAplicativo and l.empleado.contrata.idContrata = :idContrata").setString("idAplicativo", idAplicativo).setString("idContrata", idContrata).list();
newTransaction.commit();
newSession.close();
HibernateUtil.shutdown();
return aplicativos;
}
public List<LiberadorContrata> getLiberadores( String idAplicativo, String idContrata){
Session newSession = HibernateUtil.getSessionFactory().openSession();
Transaction newTransaction = newSession.beginTransaction();
List<LiberadorContrata> liberadores = newSession.createQuery("select l from Aplicativos a join a.liberadores l where a.idAplicativo = :idAplicativo and l.empleado.contrata.idContrata = :idContrata").setString("idAplicativo", idAplicativo).setString("idContrata", idContrata).list();
newTransaction.commit();
newSession.close();
HibernateUtil.shutdown();
return liberadores;
}
}
you can see methods getLibertadores and getAplicativos use hql querys i wrote above
now my test case:
AplicativosDaoImplTest
Code:
package dao.impl;
import static org.junit.Assert.*;
import java.util.List;
import org.junit.Test;
import domain.*;
public class AplicativosDaoImplTest {
@Test
public void testGetAplicativos() {
AplicativosDaoImpl aplicativosDao = new AplicativosDaoImpl();
List<Aplicativos> liberadores = aplicativosDao.getAplicativos("1", "1");
assertTrue(liberadores.size()>0 );
LiberadorContrata liberador = liberadores.get(0).getLiberadores().get(0);
System.out.println(liberador.getEmpleado().getContrata().getIdContrata());
}
@Test
public void testGetLiberadores() {
AplicativosDaoImpl aplicativosDao = new AplicativosDaoImpl();
List<LiberadorContrata> liberadores = aplicativosDao.getLiberadores("1", "1");
assertTrue(liberadores.size()>0 );
LiberadorContrata liberador = liberadores.get(0);
System.out.println(liberador.getEmpleado().getContrata().getIdContrata());
}
}
both tests print same expression: variable liberador.getEmpleado().getContrata().getIdContrata()
first test pass and print correct value but second test have error this is the error log:
Code:
org.hibernate.exception.GenericJDBCException: could not execute query
at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.loader.Loader.doList(Loader.java:2235)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129)
at org.hibernate.loader.Loader.list(Loader.java:2124)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1149)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
at com.hochschild.dao.impl.AplicativosDaoImpl.getLiberadores(AplicativosDaoImpl.java:51)
at com.hochschild.dao.impl.AplicativosDaoImplTest.testGetLiberadores(AplicativosDaoImplTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: El nombre de columna col_0_1_ no es válido.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.findColumn(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.getString(Unknown Source)
at org.hibernate.type.StringType.get(StringType.java:41)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
at org.hibernate.type.ManyToOneType.hydrate(ManyToOneType.java:126)
at org.hibernate.type.ComponentType.hydrate(ComponentType.java:583)
at org.hibernate.type.ComponentType.nullSafeGet(ComponentType.java:298)
at org.hibernate.loader.hql.QueryLoader.getResultColumnOrRow(QueryLoader.java:356)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:629)
at org.hibernate.loader.Loader.doQuery(Loader.java:724)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
at org.hibernate.loader.Loader.doList(Loader.java:2232)
... 33 more
my console show this output:
Code:
24-jun-2010 14:06:03 org.hibernate.type.NullableType nullSafeGet
INFO: could not read column value from result set: col_0_1_; El nombre de columna col_0_1_ no es válido.
24-jun-2010 14:06:03 org.hibernate.util.JDBCExceptionReporter logExceptions
ADVERTENCIA: SQL Error: 0, SQLState: S1093
24-jun-2010 14:06:03 org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: El nombre de columna col_0_1_ no es válido.
well, sorry about the long post but i wanna put most information possible i really appreciate some help or hints whats happened
kind regards
Grubhart