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.

0
treedust 11 may. 2019 a las 05:04

3 respuestas

La mejor respuesta
@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);
1
treedust 13 may. 2019 a las 21:38

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.

0
Mohamed Sweelam 11 may. 2019 a las 02:22

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;
0
m4c_4rthur 11 may. 2019 a las 06:30