Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] jpa y mysql

Estas en el tema de jpa y mysql en el foro de Java en Foros del Web. Buena tarde Grupo Podría alguien por favor darme una idea de lo siguiente. Tengo la siguiente consulta: Ya probe este query en mysql SELECT * ...
  #1 (permalink)  
Antiguo 03/12/2013, 15:19
 
Fecha de Ingreso: diciembre-2013
Mensajes: 5
Antigüedad: 10 años, 4 meses
Puntos: 0
jpa y mysql

Buena tarde Grupo

Podría alguien por favor darme una idea de lo siguiente. Tengo la siguiente consulta: Ya probe este query en mysql

SELECT * FROM Restaurantes r INNER JOIN Equiposrestaurante er ON r.id = er.idRestaurantes INNER JOIN Equipos eq ON eq.id = er.idEquipos WHERE r.numRte = "MCD 0001"


y funciona ahora lo paso a JPA

@NamedQuery(name = "Restaurantes.findByNumRte", query = "SELECT r FROM Restaurantes r "
+"INNER JOIN Equiposrestaurante er ON r.id = er.idRestaurantes "
+"INNER JOIN Equipos eq ON eq.id = er.idEquipos"
+"WHERE r.numRte = :numRte"),


public List<Restaurantes> findNumeroRestaurante(String numRte ){
EntityManager em = getEntityManager();


try {
Query query=em.createNamedQuery("Restaurantes.findByNumR te");
query.setParameter("numRte","%"+numRte+"%");
// query.setParameter("modelo", "%"+modelo+"%");

return query.getResultList();


} finally {
em.close();
}
}


Y LO PRUEBO ACA

public static void main(String args[]) {
RestaurantesJpaController restauranteJpaController = new RestaurantesJpaController();

List<Restaurantes> cargar = restauranteJpaController.findNumeroRestaurante("MC D 0001");
for (Restaurantes equiposrestaurante : cargar) {
System.out.println(equiposrestaurante.getNumRte()) ;
}
}


Y SALE ESTE ERROR

Exception [EclipseLink-8023] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-8023] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing the query [Restaurantes.findByNumRte: SELECT r FROM Restaurantes r INNER JOIN Equiposrestaurante er ON r.id = er.idRestaurantes INNER JOIN Equipos eq ON eq.id = er.idEquipos].
Exception Description: Syntax error parsing the query [Restaurantes.findByNumRte: SELECT r FROM Restaurantes r INNER JOIN Equiposrestaurante er ON r.id = er.idRestaurantes INNER JOIN Equipos eq ON eq.id = er.idEquipos].
Internal Exception: org.eclipse.persistence.internal.libraries.antlr.r untime.EarlyExitException

Muchas gracias y espero su respuesta.

Andres Infante
  #2 (permalink)  
Antiguo 03/12/2013, 17:35
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: jpa y mysql

Hola,

Tienes mal el concepto del lenguaje JPQL, este no es simplemente SQL con parámetros. Si las Entities estan construidas correctamente, podría ser:

Código SQL:
Ver original
  1. SELECT r FROM Restaurantes r
  2. INNER JOIN r.Equiposrestaurante er
  3. INNER JOIN er.Equipos eq
  4. WHERE r.numRte = :numRte
Para eso la Entity Restaurantes debe tener una relación, definida en la entidad, con Equiposrestaurante y esta con Equipos.
http://wiki.eclipse.org/EclipseLink/...ying/JPQL#JOIN

Saludos,
  #3 (permalink)  
Antiguo 04/12/2013, 02:00
 
Fecha de Ingreso: diciembre-2013
Mensajes: 5
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: jpa y mysql

Gracias HackmanC por responder. Antes que nada evise y si estaba mal, puesto que la tabla Equiposrestaurante es la que contiene las dos llaves foranead idRestaurantes e idEquipos, por ende traslade la query a dicha clase, quedando asi:

@Entity
@Table(name = "equiposrestaurante")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Equiposrestaurante.findAll", query = "SELECT e FROM Equiposrestaurante e"),
@NamedQuery(name = "Equiposrestaurante.findById", query = "SELECT e FROM Equiposrestaurante e WHERE e.id = :id"),
@NamedQuery(name = "Equiposrestaurante.findByIpDispositivo", query = "SELECT e FROM Equiposrestaurante e WHERE e.ipDispositivo = :ipDispositivo"),
@NamedQuery(name = "Equiposrestaurante.findByNumRte", query = "SELECT er FROM Equiposrestaurante er INNER JOIN er.Restaurantes r ON er.idRestaurantes = r.id INNER JOIN er.Equipos eq WHERE er.numRte = :numRte"),
@NamedQuery(name = "Equiposrestaurante.findBySerial", query = "SELECT e FROM Equiposrestaurante e WHERE e.serial = :serial"),
@NamedQuery(name = "Equiposrestaurante.findByMantenimiento", query = "SELECT e FROM Equiposrestaurante e")})
public class Equiposrestaurante implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "ipDispositivo")
private String ipDispositivo;
@Column(name = "serial")
private String serial;
@Basic(optional = false)
@Column(name = "mantenimiento")
private String mantenimiento;
@JoinColumn(name = "idRestaurantes", referencedColumnName = "id")
@ManyToOne(optional = false)
private Restaurantes idRestaurantes;
@JoinColumn(name = "idEquipos", referencedColumnName = "id")
@ManyToOne(optional = false)
private Equipos idEquipos;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idEquiposRestaurante")

private Collection<Incidenciarestaurante> incidenciarestauranteCollection;

public Equiposrestaurante() {
}

public Equiposrestaurante(Integer id) {
this.id = id;
}

public Equiposrestaurante(Integer id, String ipDispositivo, String mantenimiento) {
this.id = id;
this.ipDispositivo = ipDispositivo;
// this.serial = serial;
this.mantenimiento = mantenimiento;
}

public Integer getId() {
return id;
}

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

public String getIpDispositivo() {
return ipDispositivo;
}

public void setIpDispositivo(String ipDispositivo) {
this.ipDispositivo = ipDispositivo;
}

public String getSerial() {
return serial;
}

public void setSerial(String serial) {
this.serial = serial;
}

public String getMantenimiento() {
return mantenimiento;
}

public void setMantenimiento(String mantenimiento) {
this.mantenimiento = mantenimiento;
}

public Restaurantes getIdRestaurantes() {
return idRestaurantes;
}

public void setIdRestaurantes(Restaurantes idRestaurantes) {
this.idRestaurantes = idRestaurantes;
}

public Equipos getIdEquipos() {
return idEquipos;
}

public void setIdEquipos(Equipos idEquipos) {
this.idEquipos = idEquipos;
}

@XmlTransient
public Collection<Incidenciarestaurante> getIncidenciarestauranteCollection() {
return incidenciarestauranteCollection;
}

public void setIncidenciarestauranteCollection(Collection<Inci denciarestaurante> incidenciarestauranteCollection) {
this.incidenciarestauranteCollection = incidenciarestauranteCollection;
}

@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof Equiposrestaurante)) {
return false;
}
Equiposrestaurante other = (Equiposrestaurante) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}

@Override
public String toString() {
return "modelo.entidad.Equiposrestaurante[ id=" + id + " ]";
}

}


Creando la consulta en EquiposrestauranteJpaController asi:

public List<Equiposrestaurante> findNumeroRestaurante(String numRte ){
EntityManager em = getEntityManager();


try {
Query query=em.createNamedQuery("Equiposrestaurante.find ByNumRte");
query.setParameter("numRte","%"+numRte+"%");
return query.getResultList();


} finally {
em.close();
}
}

Y la prueba aca:

public class Prueba {


public static void main(String args[]) {
RestaurantesJpaController restauranteJpaController = new RestaurantesJpaController();
EquiposrestauranteJpaController equiposrestauranteJpaController = new EquiposrestauranteJpaController();

List<Equiposrestaurante> cargar = equiposrestauranteJpaController.findNumeroRestaura nte("MCD 0001");
for (Equiposrestaurante equiposrestaurante : cargar) {
System.out.println(equiposrestaurante.getIncidenci arestauranteCollection());
}
}

}

Ahora me arroja este error al compilar:

[EL Severe]: 2013-12-04 08:44:21.128--ServerSession(742510685)--Thread(Thread[main,5,main])--Local Exception Stack:
Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception in thread "main" javax.persistence.PersistenceException: Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Error compiling the query [Equiposrestaurante.findByNumRte: SELECT er FROM Equiposrestaurante er WHERE er.Restaurantes.id =:Restaurantes_id AND er.Equipos =:Equipos], line 1, column 46: unknown state or association field [Restaurantes] of class [modelo.entidad.Equiposrestaurante].
Exception Description: Error compiling the query [Equiposrestaurante.findByNumRte: SELECT er FROM Equiposrestaurante er WHERE er.Restaurantes.id =:Restaurantes_id AND er.Equipos =:Equipos], line 1, column 46: unknown state or association field [Restaurantes] of class [modelo.entidad.Equiposrestaurante].

at org.eclipse.persistence.exceptions.JPQLException.u nknownAttribute(JPQLException.java:457)
at org.eclipse.persistence.internal.jpa.EntityManager SetupImpl.deploy(EntityManagerSetupImpl.java:422)
at org.eclipse.persistence.internal.jpa.parsing.DotNo de.validate(DotNode.java:88)
at org.eclipse.persistence.internal.jpa.EntityManager FactoryImpl.getServerSession(EntityManagerFactoryI mpl.java:185)
at org.eclipse.persistence.internal.jpa.parsing.DotNo de.validate(DotNode.java:73)
at org.eclipse.persistence.internal.jpa.EntityManager FactoryImpl.createEntityManagerImpl(EntityManagerF actoryImpl.java:242)
at org.eclipse.persistence.internal.jpa.parsing.Node. validate(Node.java:91)
at org.eclipse.persistence.internal.jpa.parsing.Binar yOperatorNode.validate(BinaryOperatorNode.java:34)
at org.eclipse.persistence.internal.jpa.EntityManager FactoryImpl.createEntityManager(EntityManagerFacto ryImpl.java:230)
at org.eclipse.persistence.internal.jpa.parsing.Equal sNode.validate(EqualsNode.java:41)
at control.EquiposrestauranteJpaController.getEntityM anager(EquiposrestauranteJpaController.java:41)
at org.eclipse.persistence.internal.jpa.parsing.Node. validate(Node.java:91)
at control.EquiposrestauranteJpaController.findNumero Restaurante(EquiposrestauranteJpaController.java:2 45)
at org.eclipse.persistence.internal.jpa.parsing.Logic alOperatorNode.validate(LogicalOperatorNode.java:3 9)
at interfaz.Prueba.main(Prueba.java:24)
at org.eclipse.persistence.internal.jpa.parsing.Where Node.validate(WhereNode.java:34)
at org.eclipse.persistence.internal.jpa.parsing.Parse Tree.validate(ParseTree.java:207)
Caused by: Exception [EclipseLink-8030] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.JPQLException
at org.eclipse.persistence.internal.jpa.parsing.Parse Tree.validate(ParseTree.java:183)




No entiendo porque, reconozco que soy nuevo en esto de JPA, anteriormente hice un proyecto igual y cuando llegue a estas consultas lo que hice fue revolverlas mezclando JPA con Procedimientos Almacenados, cosa que no debi haber hecho porque pues para eso esta JPA, pero ahora si quiero dedicarme a la tarea de hacerlo bien, espero me puedas colaborar por favor, he leido el link que me enviaste y siguiendo los pasos creo que esta bien la sintaxys....

A la espera de tus comentarios.

Andres Infante.
  #4 (permalink)  
Antiguo 04/12/2013, 11:07
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: jpa y mysql

Hola,

Posiblemente,

Código SQL:
Ver original
  1. SELECT er FROM Equiposrestaurante er
  2. INNER JOIN er.idRestaurantes r
  3. INNER JOIN er.idEquipos eq
  4. WHERE er.numRte = :numRte

La cláusula ON es tácita, a menos que sean campos adicionales fuera de la relación. El nombre de las tablas es el nombre de las propiedades de la clase que identifican la relación. La cláusula JOIN, sin la palabra FETCH, solamente sirve para usar campos de otras tablas en el WHERE, normalmente no trae los datos de las tablas relacionadas.

Saludos,
  #5 (permalink)  
Antiguo 06/12/2013, 12:49
 
Fecha de Ingreso: diciembre-2013
Mensajes: 5
Antigüedad: 10 años, 4 meses
Puntos: 0
Respuesta: jpa y mysql

Listo HackmanC, lo solucione como dijiste...gracias. Doy por solucionado este tema.

Etiquetas: netbeans
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:04.