Ljava.lang.Object; cannot be cast to

Hola, ¿hay alguien que me pueda ayudar?

El problema es que tengo dos clases entidades VivePadres y alumno.
Quiero saber si un alumno con matricula X, esta en la tabla o entidad VivePadres.
Pero al momento de hacer la consulta me manda un error...

*****************************************************
Mi clase VivePadres tiene entre sus atributos este:
*****************************************************

@ManyToOne
@JoinColumn(name = "vpmatricula_alu", referencedColumnName = "clave")
private alumno alumno;

*****************************************************
Mi clase alumno tiene entre sus atributos este :
*****************************************************
 

*****************************************************
El método de la consulta es:
*****************************************************
 
................................................................................................................................................................................................................
El error surge en la linea esta parte:

viveP= (VivePadres) session.createSQLQuery("select * from \"vivePadres\" where vpmatricula_alu='2004060042'").uniqueResult();
vpmatricula_alu='2004060042'").uniqueResult());

y es este:

*****error obtienevivePadres*******: [Ljava.lang.Object; cannot be cast to asignacionBecas.VivePadres

Necesito ayuda, por favor!.

Gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de WinDoctor

createSQLQuery consulta tablas

Si bien recuerdo, createSQLQuery no consulta los Objetos, sino directamente las tablas de la BD, por lo cual no te devuelve objetos de entidad.

Deberias utilizar mejor createQuery. Cuando utilizaba Hibernate, usaba el API Criteria, me gustaba más.

Imagen de ro0206

Ya lo intenté con Criteria

Gracias WinDoctor!

Sigo en las mismas,

De hecho con Criteria estoy trabajando, pero como me manda este error, lo intente con SQLQuery.
este es mi metodo anteriror:

 

el error que me envia es este

*****error obtienevivePadres*******: could not execute query
23/09/2010 06:42:06 PM org.hibernate.util.JDBCExceptionReporter logExceptions
ADVERTENCIA: SQL Error: 0, SQLState: 42P01
23/09/2010 06:42:06 PM org.hibernate.util.JDBCExceptionReporter logExceptions
GRAVE: ERROR: relation "vivepadres" does not exist

Si un alma caritativa pudiera ayudarme, se lo voy a agradecer mucho. :)

Imagen de ezamudio

idVp?

Si la propiedad por la que estás filtrando, idVp, es la llave primaria de la entidad VivePadres, entonces puedes simplemente hacer   y eso te devuelve la instancia de VivePadres con esa llave.

Imagen de ezamudio

"vivepadres" does not exist

Pero ya vi bien tu error y la bronca es que la tabla vivepadres no existe en la base de datos. Sería bueno que también leyeras los mensajes de error y los trates de entender...

Imagen de ro0206

Si existe

si, es lo que dice, pero vivePadres si existe en la base de datos
voy a probar lo del load.
Gracias ezamudio

Imagen de Shadonwk

entonces talvez no la estas

entonces talvez no la estas mapenado bien...

Imagen de ro0206

mmm no es que quiera que me hagan el trabajo he!

probe con el load y me aparece el mismo error, insiste en que vivePadres no existe, pero nose porque.. si si existe.
cuales podrian ser las razones?

Imagen de JaimeItlzc

Lo tienes bien escrito

Lo tienes bie escrito ya checaste?

Tal ves podria ser eso.

Saludos.

Imagen de ezamudio

No existe

Si te pones en plan de a ver quién es más necio, la computadora va a ganar, siempre. Lo puedes correr 800millones de veces y siempre SIEMPRE vas a obtener el mismo error. Puedes cambiar el load por un Criteria y usar uniqueResult o ponerle setMaxResults(1).list() y con eso te da una lista y obtener el primer objeto nada mas (debe tener un solo objeto la lista)... y vas a obtener el mismo error, porque el error es que no existe la tabla.

Tu entras a la base de datos y ves que sí existe. Date un respiro y fíjate muy bien... existe la tabla vivepadres? o es vive_padres? estás viendo esa tabla en la misma base de datos que usa la aplicación? fíjate en el URL de conexión que usa la aplicación. Qué base de datos es? la palabra "relation" me hace pensar que estás con PostgreSQL. Pero podría ser Oracle o alguna otra cosa. Recuerdo que Oracle tiene un esquema medio raro que si un usuario crea una tabla entonces otro usuario no la ve o algo así; asegúrate que si revisas la existencia de la tabla, sea en la base de datos que usa la aplicación, con el mismo usuario que usa la aplicación para conectarse a la base. Misma IP, etc etc.

No es problema de que la tabla está mal mapeada porque entonces obtendrías otro error, como que no existe una columna o tiene nombre distinto, etc. Lo único que podría ser problema de mapeo es el nombre de la tabla, como mencioné, tal vez se llama vive_padres o se llama vivePadres y resulta que los nombres de las tablas son sensibles a mayúsculas y hibernate ejecuta un query sobre vivepadres y por eso no existe. En ese caso debes especificar el nombre de la tabla, en la anotación de la clase VivePadres con   o como se llame la tabla.

Pero lo más importante que debes aprender de todo esto, es a leer detenidamente los mensajes de error y comprenderlos bien, porque estabas pensando que era por el método que usabas y desde el principio se nota que era porque la tabla no existe (la tabla que busca hibernate no existe; tal vez la tabla que tú quieres que hibernate use, sí existe, pero para bien o para mal las computadoras hacen lo que el programador les dice que hagan, no lo que el programador quiere que hagan).

Imagen de ro0206

gracias!

Si era el nombre de la tabla, se llama "vivePadres" no vivePadres. No habia tomado en cuenta las comillas.

Gracias otra vez y tomaré muy en cuenta tu consejo...

Imagen de ezamudio

RDBMS?

Qué RDBMS estás usando que te deja usar comillas como parte del nombre de una tabla?

Imagen de ro0206

postgreSQL

postgreSQL es el sistema administrador que estoy utilizando.
Cuando creo las tablas el manejador le pone las comillas automaticamente por lo que llevan mayusculas.

Imagen de ezamudio

PostgreSQL

Con razón porque normalmente postgres no es sensible a mayúscula, le da igual si dices select * from vivepadres que from vivePadres o ViVePaDrEs o lo que sea. Excepto si le pones comillas, entonces el nombre de la tabla no es que tenga comillas sino que se vuelve sensible a mayúsculas y luego si lo llamas sin comillas lo convierte todo a minúsculas y por eso no lo encuentra. Pero bueno ya lo resolviste, no?

Imagen de ro0206

si, esta resuelto

sip, gracias a tu comentario porque mi cerebro ya estaba bloqueado al ver siempre lo mismo, sin tomar en cuenta lo que realmente era el error.

Imagen de Nopalin

Para empezar, el error que

Para empezar, el error que ta marca es un casteo de un array.
En segundo, el query que estas ejecutando es directo a la base de datos y te regresa datos crudos, o en que momento le estas diciendo a hibernate que el query va relacionado con una entidad? exacto en ningun lado. Hibernate ejecuta el query y obtiene una sola fila, pero la fila tiene muchas columnas por eso te regresa un array.

Si quieres buscar una entidad usa algo como:
 

sobres

Imagen de slipox

problema similar

tengo una problema con respecto al mismo tema trabajo con tomcat mysql y vaadim
el problema es para realizar consultas cuando no es por el campo clave y le e dado vuelta al tema es mas me eh creado clases aparte de las que trabajo con jpa para asi poder trabajar directamente con la bd

package fondar.DominioMysql;

import java.math.BigInteger;
import java.util.Date;

public class StockMySql {

private BigInteger id;

private BigInteger existencia;

private BigInteger mueble_id;

private BigInteger local_id;
private String motivo;
private Date fechaUltimaModificacion;
public BigInteger getId() {
return id;
}
public void setId(BigInteger id) {
this.id = id;
}
public BigInteger getExistencia() {
return existencia;
}
public void setExistencia(BigInteger existencia) {
this.existencia = existencia;
}
public BigInteger getMueble_id() {
return mueble_id;
}
public void setMueble_id(BigInteger mueble_id) {
this.mueble_id = mueble_id;
}
public BigInteger getLocal_id() {
return local_id;
}
public void setLocal_id(BigInteger local_id) {
this.local_id = local_id;
}
public String getMotivo() {
return motivo;
}
public void setMotivo(String motivo) {
this.motivo = motivo;
}
public Date getFechaUltimaModificacion() {
return fechaUltimaModificacion;
}
public void setFechaUltimaModificacion(Date fechaUltimaModificacion) {
this.fechaUltimaModificacion = fechaUltimaModificacion;
}
@Override
public String toString() {
return "StockMySql [id=" + id + ", existencia=" + existencia
+ ", mueble_id=" + mueble_id + ", local_id=" + local_id
+ ", motivo=" + motivo + ", fechaUltimaModificacion="
+ fechaUltimaModificacion + "]";
}

}

package fondar.Dominio;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;

/**
* Entity implementation class for Entity: stock
*
*/
@Entity
public class Stock implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@NotNull
private Integer existencia;
@OneToOne
private Mueble mueble;
@OneToOne
@Valid
private Local local;
private String motivo;
private Date fechaUltimaModificacion;

public Date getFechaUltimaModificacion() {
return fechaUltimaModificacion;
}

public void setFechaUltimaModificacion(Date fechaUltimaModificacion) {
this.fechaUltimaModificacion = fechaUltimaModificacion;
}

public String getMotivo() {
return motivo;
}

public void setMotivo(String motivo) {
this.motivo = motivo;
}

public Local getLocal() {
return local;
}

public void setLocal(Local local) {
this.local = local;
}

public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}

@Override
public String toString() {
return "Stock [id=" + id + ", existencia=" + existencia + ", mueble="
+ mueble.getNombre() + ", local=" + local.getNombre() + ", motivo=" + motivo + "]";
}

public Integer getExistencia() {
return existencia;
}

public void setExistencia(Integer existencia) {
this.existencia = existencia;
}

public static long getSerialversionuid() {
return serialVersionUID;
}

public Mueble getMueble() {
return mueble;
}

public void setMueble(Mueble mueble) {
this.mueble = mueble;
}

}

///////////////////////////////////////
cuando ejecuto esto
List result = Core.getEntityManager().createQuery("SELECT * FROM Stock t1 WHERE t1.local_id= 1 and t1.mueble_id= 38" ).getResultList();

//List listaStock = new ArrayList();
for (Object o : result) {
StockMySql s= (StockMySql) o;
System.out.print(s.toString());//stock.getMotivo());
}
por la consola XD pork ahi hago las pruebas
[JPivot] 30 ago 2012 02:46:44,047 ERROR [Session ] org.hibernate.hql.internal.ast.ErrorCounter#reportError: line 1:8: unexpected token: *
[JPivot] 30 ago 2012 02:46:44,066 ERROR [Session ] org.hibernate.hql.internal.ast.ErrorCounter#reportError: line 1:8: unexpected token: *
line 1:8: unexpected token: *
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectClause(HqlBaseParser.java:1256)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectFrom(HqlBaseParser.java:1030)
at org.hibernate.hql.internal.antlr.HqlBaseParser.queryRule(HqlBaseParser.java:700)
at org.hibernate.hql.internal.antlr.HqlBaseParser.selectStatement(HqlBaseParser.java:294)
at org.hibernate.hql.internal.antlr.HqlBaseParser.statement(HqlBaseParser.java:157)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:266)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
at fondar.DominioMysql.Ejecutar.main(Ejecutar.java:92)
Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [SELECT * FROM fondar.Dominio.Stock t1 WHERE t1.local_id= 1 and t1.mueble_id= 38]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294)
at fondar.DominioMysql.Ejecutar.main(Ejecutar.java:92)
Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: * near line 1, column 8 [SELECT * FROM fondar.Dominio.Stock t1 WHERE t1.local_id= 1 and t1.mueble_id= 38]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(ErrorCounter.java:79)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:276)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:180)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)
at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:291)
... 1 more
dije similar pork si lo paso a native query el resultado es el siguiente
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to fondar.DominioMysql.StockMySql
at fondar.DominioMysql.Ejecutar.main(Ejecutar.java:98)
y si cambio a Stock el casting

List result = Core.getEntityManager().createNativeQuery("SELECT * FROM Stock t1 WHERE t1.local_id= 1 and t1.mueble_id= 38" ).getResultList();

//List listaStock = new ArrayList();
for (Object o : result) {
Stock s= (Stock) o;
System.out.print(s.toString());//stock.getMotivo());
}
el error es el siguiente
por mas informacion y demas cosas k presisen pregunten no hay drama
saludos Gonzalo

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to fondar.Dominio.Stock
at fondar.DominioMysql.Ejecutar.main(Ejecutar.java:100)