es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring JPA @OneToMany El valor del parámetro [] no coincide con el tipo esperado

Obtengo este error al solicitar la línea de servicio:

List<order> orders = ordersRepository.getByCustomerId(id);

Error:
org.springframework.dao.InvalidDataAccessApiUsageException: El valor del parámetro [5] no coincide con el tipo esperado [nz.webshop.models.Customer.Customers (n/a)]; la excepción anidada es java.lang.IllegalArgumentException: El valor del parámetro [5] no coincide con el tipo esperado [nz.webshop.models.Customer.Customers (n/a)]

Repositorio:

public interface OrdersRepository extends JpaRepository<order, integer=""> {
    List<order> getByCustomerId(Integer customerId);
}

Entidades:

@EntityA:
@Table(name = "orders")
public class Order {
    @ManyToOne(targetEntity = Customers.class)
    @JoinColumn(name = "customer_id", referencedColumnName = "customer_id")
    private Integer customerId;
    ...getters/setters
}

@EntityB:
@Table(name = "customer")
public class Customers {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "customer_id")
    private Integer customerId;

    @OneToMany(targetEntity = Order.class, mappedBy = "customerId")
    private List<order> Order;
...getters/setters
}

Donde las tablas son así:

CREATE TABLE orders
(
  order_id    INT AUTO_INCREMENT PRIMARY KEY,
  customer_id INT,
  FOREIGN KEY (customer_id) REFERENCES customer (customer_id)
);

CREATE TABLE customer
(
  customer_id INT AUTO_INCREMENT PRIMARY KEY,
  first_name  VARCHAR(50),
  last_name   VARCHAR(50)
);

Actualización:
He cambiado la entidad EntityA de la siguiente manera:

@EntityA:
@Table(name = "orders")
public class Order {
    @Column(name = "customer_id") 
    private Integer customerId;

    @ManyToOne(targetEntity = Customers.class)
    private Customer customer;

    ...getters/setters
}

Pero luego, al solicitar la misma línea de servicio, obtengo un nuevo error: org.springframework.dao.InvalidDataAccessResourceUsageException: no se pudo extraer el conjunto de resultados; SQL [n/a]; la excepción anidada es org.hibernate.exception.SQLGrammarException: no se pudo extraer el conjunto de resultados. Com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Columna desconocida ‘order0.customer_customer_id’ en ‘lista de campos’.

¿Dónde podría estar el problema?</order,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema parece encontrarse en el mapeo de la anotación @JoinColumn en la clase Order de la entidad A. Deberías actualizar la anotación @JoinColumn de la siguiente manera:

    @JoinColumn(name = "customer_id")
    

    Esto asegurará que la columna customer_id en la tabla orders se mapee correctamente al campo customerId en la clase Order de la entidad A.

    Una vez que realices este cambio, también debes actualizar la anotación @ManyToOne en la clase Order de la entidad A para que se mapee a la entidad Customers:

    @ManyToOne(targetEntity = Customers.class, fetch = FetchType.LAZY)
    @JoinColumn(name = "customer_id", referencedColumnName = "customer_id")
    private Customers customer;
    

    Al especificar los atributos targetEntity y fetch, le estás indicando a Hibernate que mapee la columna customer_id en la tabla orders al campo customerId en la clase Customers de la entidad B.

    Finalmente, debes actualizar la anotación @OneToMany en la clase Customers de la entidad B para que se mapee al campo customer en la clase Order de la entidad A:

    @OneToMany(mappedBy = "customer")
    private List<order> orders;
    

    Al especificar el atributo mappedBy, le estás indicando a Hibernate que mapee el campo customer en la clase Order de la entidad A al campo orders en la clase Customers de la entidad B.

    Con estos cambios, deberías poder recuperar los pedidos por el ID del cliente sin encontrar errores.

Comments are closed.