java.sql.SQLSyntaxErrorException: такого столбца нет: id - PullRequest
0 голосов
/ 11 мая 2019
java.sql.SQLSyntaxErrorException: No such column: id

Когда таблица уже содержит столбец id

Я пытаюсь получить следующий собственный SQL-запрос, который выполняется с ожидаемыми результатами из MariaDB SQL из класса репозитория:

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 

Существуют следующие классы сущностей:


@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
}

Хранилище:


@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);
}

Есть идеи, почему я получаю эту ошибку во время выполнения? Эта ошибка не возникает во время компиляции.

Ответы [ 3 ]

1 голос
/ 11 мая 2019
@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);

должно было быть List<String>, а не List<Table1>

, поэтому решение было:

@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);
0 голосов
/ 11 мая 2019

Попробуйте добавить элемент Id в table1 и аннотировать поля Id обеих таблиц аннотацией @Id, как показано ниже.

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
0 голосов
/ 11 мая 2019

Вы пытаетесь выполнить поиск в таблице2 с использованием идентификатора, но вы не выбрали правильный столбец сопоставления из таблицы1, который должен быть table2_id.id , поэтому запрос должен выглядеть примерно так:

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 

Также обратите внимание вы используете собственный запрос , что означает прямой запрос к БД, поэтому убедитесь, что вы используете то же правильное имя в таблицах вашей базы данных.

...