java.sql.SQLSyntaxErrorException: No such column: id
Cuando la tabla ya contiene la columna id
Estoy tratando de tener la siguiente consulta SQL nativa que se ejecuta con los resultados esperados dentro de MariaDB SQL desde una clase de repositorio:
SELECT name
FROM table1 t1
WHERE t1.table2_id IN (
SELECT id
FROM table2 t2
WHERE t2.column1_number = 1 AND
t2.id IS NOT NULL
)
ORDER BY t1.name
Las clases de entidad son las siguientes:
@Entity
@Table(name = "table1")
public class Table1 {
@Column(nullable = false)
private String name;
@Column(nullable = false)
private Integer number;
@ManyToOne
@JoinColumn(name = "table2_id")
private Table2 table2;
// Getters and Setters
}
@Entity
@Table(name="table2")
public class Table2 {
private Integer id;
private Integer column1_number;
@Override
public Integer getId() {
return id;
}
@Override
public void setId(Integer id) {
this.id = id;
}
// Getters and Setters
}
El repositorio es:
@Repository
public interface Table1Repository extends JpaRepository<Table1, Integer> {
@Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
List<Table1> findByNumberOrderByName(Integer number);
}
¿Alguna idea de por qué recibo este error en tiempo de ejecución? Este error no ocurre en tiempo de compilación.
3 respuestas
@Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
List<Table1> findByNumberOrderByName(Integer number);
Debería haber sido List<String>
y no List<Table1>
Y entonces la solución fue:
@Query(value = "SELECT name FROM table1 t1 WHERE t1.table2_id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = ?1 AND t2.id IS NOT NULL) ORDER BY t1.name", nativeQuery = true)
List<String> findByNumberOrderByName(Integer number);
Está intentando buscar en la tabla2 usando id, pero no eligió la columna de asignación correcta de la tabla1, que debería ser table2_id.id , por lo que la consulta debería ser algo como esto
SELECT name FROM table1 t1 WHERE t1.table2_id.id IN (SELECT id FROM table2 t2 WHERE t2.column1_number = 1 AND t2.id IS NOT NULL) ORDER BY t1.name
También tenga en cuenta que está usando una consulta nativa , lo que significa consultar la base de datos directamente, así que asegúrese de estar usando el mismo nombre correcto en las tablas de la base de datos.
Intente agregar el elemento Id a la tabla1 y anote los campos Id de ambas tablas con la anotación @Id como se muestra a continuación.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
Nuevas preguntas
java
Java es un lenguaje de programación de alto nivel. Utilice esta etiqueta cuando tenga problemas para usar o comprender el idioma en sí. Esta etiqueta rara vez se usa sola y se usa con mayor frecuencia junto con [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] y [maven].