Пользовательский запрос Spring Boot возвращает отношение "todo" не существует - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я пишу свое первое приложение Spring Boot, в котором я не хочу создавать простое приложение todo.

База данных работает нормально, пока я использую только функции CRUD, и как только я вызываю собственный запрос, я получаю эту ошибку:

2018-11-19 10:00:36.353 ERROR 25065 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause

org.postgresql.util.PSQLException: ERROR: relation "todo" does not exist

Мой ToDoController:

package ch.aintevenmad.todo;

import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;

@RestController
public class ToDoController {
    private ToDoRepository repository;

    public ToDoController(ToDoRepository repository) {
        this.repository = repository;
    }

    @GetMapping("/todo")
    @CrossOrigin(origins = "http://localhost:4200")
    public Collection<ToDo> allToDo() {
        return new ArrayList<>(repository.findAll());
    }

    @GetMapping("/first")
    @CrossOrigin(origins = "http://localhost:4200")
    public ToDo firstToDo() {
        return repository.findAll().get(0);
    }

    @GetMapping("/delete")
    @CrossOrigin(origins = "http://localhost:4200")
    public void deleteToDo(ToDo toDo) {
        repository.delete(toDo);
    }

    @GetMapping("/add")
    @CrossOrigin(origins = "http://localhost:4200")
    public ToDo addToDO() {
        Date date = new Date();
        ToDo toDo = new ToDo("Hello", date, false);
        repository.save(toDo);
        return toDo;
    }

    @GetMapping("/countcompletedtasks")
    @CrossOrigin(origins = "http://localhost:4200")
    public int countCompletedTasks() {
        return repository.countCompletedTasks().size();
    }

    @GetMapping("/deleteall")
    @CrossOrigin(origins = "http://localhost:4200")
    public void deleteAll() {
        repository.deleteAll();
    }

    @GetMapping("/loaddefaults")
    @CrossOrigin(origins = "http://localhots:4200")
    public void createDefaults() {
        repository.save(new ToDo("PMB", false));
        repository.save(new ToDo("GMDU", false));
        repository.save(new ToDo("INMA", true));
        repository.save(new ToDo("SLGP", false));
    }

}

My ToDo Class:

package ch.aintevenmad.todo;

import lombok.*;

import javax.persistence.*;
import java.util.Date;

@Entity
@Data
@NoArgsConstructor
public class ToDo {
    @Id
    @GeneratedValue
    private Long id;
    private @NonNull
    String taskName;
    private Date dueDate;
    private String extraNote;
    private boolean taskCompleted;

    public ToDo(String taskName, boolean taskCompleted) {
        this.taskName = taskName;
        this.taskCompleted = taskCompleted;
    }
    public ToDo(String taskName, Date dueDate, boolean taskCompleted) {
        this.taskName = taskName;
        this.dueDate = dueDate;
        this.taskCompleted = taskCompleted;
    }
}

Мой ToDoRepository:

package ch.aintevenmad.todo;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.web.bind.annotation.CrossOrigin;

import java.util.Collection;

@RepositoryRestResource
@CrossOrigin(origins = "http://localhost:4200")
public interface ToDoRepository extends JpaRepository<ToDo, Long> {
    @Query(value = "SELECT * FROM ToDo WHERE taskCompleted = true", nativeQuery = true)
    Collection<ToDo> countCompletedTasks();
}

Я неправильно настроил свой проект или неправильно понял, как настраиваемые запросы работают с Spring Boot?

Спасибо за любую помощь!

РЕДАКТИРОВАТЬ: Спасибо Tu.ma вы нашли проблему. Postgresql не вызвал таблицу todo, как ожидалось, но to_do, поэтому, конечно, он не оштрафовал таблицу ...

Ответы [ 4 ]

0 голосов
/ 19 ноября 2018

Спасибо Tu.ma вы нашли проблему.Postgresql не вызвал таблицу todo, как ожидалось, но to_do, поэтому, конечно, он не оштрафовал таблицу.

0 голосов
/ 19 ноября 2018

Создайте конструктор по умолчанию для сущности Todo.

0 голосов
/ 19 ноября 2018

Обратите внимание, что вы можете просто использовать один из встроенных в Spring запросов:

Collection<ToDo> findByTaskCompletedIsTrue();

Если вам действительно нужен только номер (как следует из названия вашего метода), вы также можете использовать countBy

Long countByTaskCompletedIsTrue();

См. документы для дополнительных запросов

0 голосов
/ 19 ноября 2018

Вы должны изменить свой запрос, как показано ниже.

Ваше истинное утверждение должно быть похоже на 'true', а не только на true.

@RepositoryRestResource
@CrossOrigin(origins = "http://localhost:4200")
public interface ToDoRepository extends JpaRepository<ToDo, Long> {
    @Query(value = "SELECT * FROM ToDo WHERE taskCompleted = 'true'", nativeQuery = true)
    Collection<ToDo> countCompletedTasks();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...