Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Duda] Exception PruebaDeDesempeño

Hola amigos un gusto saludarlos.

Me gustaría que alguno de ustedes me ayude con esta Exception que se me presento cuando estaba corriendo la PruebaDeDesempeño

Las tablas se crean adecuadamente pero la información no se inserta en ellas.

Exception in thread "main" java.lang.IllegalArgumentException: Type specified 
 for TypedQuery [com.latam.alura.tienda.modelo.Categoria] is incompatible with query 
 return type [class com.latam.alura.tienda.modelo.Producto]

        at org.hibernate.internal.AbstractSharedSessionContract.buildIncompatibleException(AbstractSharedSessionContract.java:1029)
        at org.hibernate.internal.AbstractSharedSessionContract.resultClassChecking(AbstractSharedSessionContract.java:888)
        at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:849)
        at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:23)
        at com.latam.alura.tienda.dao.CategoriaDAO.consultaPorNombre(CategoriaDAO.java:47)
        at com.latam.alura.tienda.prueba.LoadRecords.loadProducto(LoadRecords.java:61)
        at com.latam.alura.tienda.prueba.LoadRecords.cargaRegistros(LoadRecords.java:35)
        at com.latam.alura.tienda.prueba.PruebaDeDesempenho.main(PruebaDeDesempenho.java:13)

Segun lo que indica este error se produce cuando el tipo especificado en la consulta TypedQuery no coincide con el tipo de entidad que se espera devolver."

Class Categoria:

package com.latam.alura.tienda.modelo;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "categorias")
public class Categoria {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Long id;
  private String nombre;

  public Categoria() {  }

  public Categoria(String nombre) {
    this.nombre = nombre;  }

  public Long getId() {
    return id;  }

  public String getNombre() {
    return nombre;  }

  public void setNombre(String nombre) {
    this.nombre = nombre;  }
}

Class Producto

package com.latam.alura.tienda.modelo;

import java.math.BigDecimal;
import java.time.LocalDate;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQuery;
import javax.persistence.Table;


@SuppressWarnings("all")
@Entity
@Table(name="productos")
@NamedQuery(name="Producto.consultaDePrecio", query="SELECT P.precio FROM Producto AS P WHERE P.nombre=:nombre")

public class Producto {

  @Id
  @GeneratedValue(strategy=GenerationType.IDENTITY)
  private Long id; 
  private String nombre;
  private String descripcion;
  private BigDecimal precio;
  private LocalDate fechaDeRegistro = LocalDate.now();

  @ManyToOne
  private Categoria categoria;

  public Producto() {  }

  public Producto(String nombre, String descripcion, BigDecimal precio, Categoria categoria) {
    this.nombre = nombre;
    this.descripcion = descripcion;
    this.precio = precio;
    this.categoria = categoria;
  }

  public Long getId() {
    return id;  }

  public String getNombre() {
    return nombre;  }

  public void setNombre(String nombre) {
    this.nombre = nombre;  }

  public String getDescripcion() {
    return descripcion;  }

  public void setDescripcion(String descripcion) {
    this.descripcion = descripcion;  }

  public BigDecimal getPrecio() {
    return precio;  }

  public void setPrecio(BigDecimal precio) {
    this.precio = precio;  }

  public LocalDate getFecha(){
    return fechaDeRegistro;  }

}

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

2 respuestas

parece ser que es porque no le estas mandando datos a H2

Hola.. gracias por responder

Puedes ser más específico de donde buscar el problema ?

Los datos que se tienen que ingresar en las tablas están en los txt. alojados en la carpeta utils. categoria.txt ****cliente.txt producto.txt

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

En la class LoadRecords se agrego la dir de dicha carpeta.

package com.latam.alura.tienda.prueba;

"quite los import para que no sea tan grande"

public class LoadRecords {
  public static void cargaRegistros() throws FileNotFoundException {

    EntityManager em = JPAUtils.getEntityManager();

    CategoriaDAO categoriaDAO = new CategoriaDAO(em);
    ProductoDAO productoDAO = new ProductoDAO(em);
    ClienteDAO clienteDAO = new ClienteDAO(em);
    PedidoDAO pedidoDAO = new PedidoDAO(em);

    em.getTransaction().begin();

    loadCategoria("categoria", categoriaDAO, em);
    loadProducto("producto", productoDAO, categoriaDAO, em);
    loadCliente("cliente", clienteDAO, em);

    List<Cliente> clientesList = clienteDAO.consultarTodos();
        List<Pedido> pedidoList = new ArrayList<>();

        for(Cliente cl:clientesList) {
            pedidoList.add(new Pedido(cl)); }

        for(int i=0;i<pedidoList.size();i++) {
            pedidoList.get(i).agregarItems(new ItemsPedido(i+1,productoDAO.consultaPorId((long) (i+1)),pedidoList.get(i)));
            pedidoDAO.guardar(pedidoList.get(i));     }

        em.getTransaction().commit();
        em.close(); }

    private static void loadProducto(String type, ProductoDAO productoDAO,CategoriaDAO categoriaDAO, EntityManager em) throws FileNotFoundException {
        List<String> productosTxt =readFile(type);
        for(int i=0;i<productosTxt.size();i++) {
            String[] line = productosTxt.get(i).split(";");
            if(line.length>1) {
                Categoria categoria = categoriaDAO.consultaPorNombre(line[3]);
                Producto producto = new Producto(line[4],line[0],new BigDecimal(line[1]),categoria);
                productoDAO.guardar(producto);
                em.flush(); } } } 

    private static void loadCategoria(String type, CategoriaDAO categoriaDAO, EntityManager em) throws FileNotFoundException {
        List<String> categoriasTxt =readFile(type);        
        for(int i=0;i<categoriasTxt.size();i++) {
            String[] line = categoriasTxt.get(i).split(";");
            if(line.length==1) {
                Categoria categoria = new Categoria(categoriasTxt.get(i));
                categoriaDAO.guardar(categoria);
                em.flush();    } } }

    private static void loadCliente(String type, ClienteDAO clienteDAO, EntityManager em) throws FileNotFoundException {
        List<String> clientesTxt =readFile(type);        
        for(int i=0;i<clientesTxt.size();i++) {
            String[] line = clientesTxt.get(i).split("~");
            System.out.println(line[0]+line[1]);
            if(line.length>1) {
                Cliente cliente= new Cliente(line[0],line[1]);
                clienteDAO.guardar(cliente);
                em.flush();    } } }

    private static List<String> readFile(String type) throws FileNotFoundException {
        File file = new File("C:\\Users\\flv15\\OneDrive\\Documentos\\Programacion\\Programacion\\Java y JPA Avanzado\\nuevaTienda\\src\\main\\resources\\utils\\"+type+".txt");
        Scanner scan = new Scanner(file);
        List<String> pedido= new ArrayList<>();
        while(scan.hasNextLine()){
            pedido.add(scan.nextLine());}
        scan.close();
        return pedido;    }  }

Saludos