Java Spring Boot自定义查询返回关系";“待办事项”;不存在

Java Spring Boot自定义查询返回关系";“待办事项”;不存在,java,postgresql,spring-boot,Java,Postgresql,Spring Boot,我目前正在编写我的第一个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 cont

我目前正在编写我的第一个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));
    }

}
我的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();
}
包ch.aintevenmad.todo;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.data.rest.core.annotation.RepositoryRestResource;
导入org.springframework.web.bind.annotation.CrossOrigin;
导入java.util.Collection;
@存储资源
@交叉原点(原点=”http://localhost:4200")
到存储库的公共接口扩展了JpaRepository{
@查询(value=“SELECT*FROM ToDo,其中taskCompleted=true”,nativeQuery=true)
集合countCompletedTasks();
}
我是否设置了错误的项目,或者我是否误解了自定义查询如何与Spring Boot一起工作

谢谢你的帮助


编辑:谢谢你,你找到问题了。Postgresql没有像预期的那样调用表todo,但是这样做当然不会使表变好…

您必须像下面这样更改查询

你的真实陈述应该是“真实”的,而不仅仅是“真实”

@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();
}
@RepositoryRestResource
@交叉原点(原点=”http://localhost:4200")
到存储库的公共接口扩展了JpaRepository{
@查询(value=“SELECT*FROM ToDo,其中taskCompleted='true',nativeQuery=true)
集合countCompletedTasks();
}

为Todo实体创建默认构造函数。

注意,您可以只使用spring的一个内置查询:

Collection<ToDo> findByTaskCompletedIsTrue();

有关更多查询,请参阅

谢谢你找到了问题。Postgresql没有按预期调用表todo,但这样做当然不会使表变好。

@noargsconstuctor为他做了这件事。您能检查一下Postgresql中如何调用表吗?不用经历春天。谢谢你,你发现了问题。Postgresql没有像预期的那样调用表todo,但这样做当然不会使表变好……如果您找到了解决方案,请将该解决方案作为答案发布,不要为此编辑您的问题。回答自己的问题(并接受自己的答案)是完全可以接受的
Collection<ToDo> findByTaskCompletedIsTrue();
Long countByTaskCompletedIsTrue();