【问题标题】:Spring Boot custom query returns relation "todo" does not existSpring Boot 自定义查询返回关系“todo”不存在
【发布时间】:2019-04-21 15:01:04
【问题描述】:

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

我的待办事项控制器:

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

}

我的 ToDo 类:

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 这样做当然没有很好的表...

【问题讨论】:

  • 你能检查一下表在postgresql中是如何调用的吗?不用经过春天。
  • 感谢 Tu.ma 你找到了问题。 Postgresql 没有按预期调用表 todo 但 to_do 这样做当然没有很好的表...
  • 如果您找到了解决方案,然后将该解决方案作为答案发布,请勿为此编辑您的问题。回答您自己的问题(并接受您自己的回答)是完全可以接受的

标签: java postgresql spring-boot


【解决方案1】:

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

你的真实陈述应该像“真实”而不是只有真实。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • @NoArgsConstructor 为他做这件事。
    【解决方案3】:

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

    Collection<ToDo> findByTaskCompletedIsTrue();
    

    如果你真的只需要数字(正如你的方法名称所暗示的那样),你也可以使用 countBy

    Long countByTaskCompletedIsTrue();
    

    更多查询请查看docs

    【讨论】:

      【解决方案4】:

      感谢Tu.ma,您找到了问题。 Postgresql 没有按预期调用表 todo 但 to_do 这样做当然没有很好的表。

      【讨论】:

        猜你喜欢
        • 2012-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-07-07
        • 1970-01-01
        • 2016-04-15
        • 1970-01-01
        • 2019-01-12
        • 2016-03-22
        相关资源
        最近更新 更多