CrudRepository 无法在 h2 db 上执行任何查询

Posted

技术标签:

【中文标题】CrudRepository 无法在 h2 db 上执行任何查询【英文标题】:CrudRepository not able to perform any queries on h2 db 【发布时间】:2020-01-18 19:18:43 【问题描述】:

我是弹簧数据的新手。我的应用程序中有一个 h2 db 以及一个休息控制器。本质上,我有几个端点可以调用来执行某些查询。端点将使用扩展 crudrepository 的 itnerface 并执行查询。问题是我调用了端点,但 crudrepository 似乎在数据库中找不到任何东西。我访问了数据库控制台,可以看到我使用data.sql 为数据库播种的预填充数据。

这就是我所拥有的:

@Repository
public interface EmployeeRepository extends CrudRepository<Employee, Long> 

这是我的实体:

@Entity

public class Employee 

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String firstname;

public Employee()

public Employee(String firstname, String lastname, String email) 
    this.firstname = firstname;
    this.lastname = lastname;
    this.email = email;


public Long getId() 
    return id;


public void setId(Long id) 
    this.id = id;


public String getFirstname() 
    return firstname;


public void setFirstname(String firstname) 
    this.firstname = firstname;


public String getLastname() 
    return lastname;


public void setLastname(String lastname) 
    this.lastname = lastname;


public String getEmail() 
    return email;


public void setEmail(String email) 
    this.email = email;


private String lastname;
private String email;

控制器:

@RestController 
public class EmployeeController 

@Autowired
EmployeeService employeeServices;

@GetMapping("/getAllEmployees")
public void getAllEmployees()

    //Add employee to db via spring data
    employeeServices.getAllEmployees();


@GetMapping("/deleteEmployee/id")
public void delete(@PathVariable Long id)

    //Delete employee to db via spring data
    employeeServices.deleteEmployee(id);
    System.out.printf("Deleted");


@PostMapping("/createEmployee")
public void create(@RequestBody Employee employee)
    //Add employee to db via spring data

    Employee save = employeeServices.createEmployee(employee);
    System.out.println("created: " + save.toString());


还有我的服务:

@Service
public class EmployeeService

@Autowired
EmployeeRepository employeeRepository;

public void getAllEmployees()
    List<Employee> listOfEmployees = new ArrayList<>();
    employeeRepository.findAll().forEach(employee -> listOfEmployees.add(employee));

    System.out.println(listOfEmployees);


public void deleteEmployee(Long id)
    employeeRepository.deleteById(id);
    System.out.println("deleted.");


public Employee createEmployee(Employee employee)
    employeeRepository.save(employee);
    System.out.println("saved.");
    return employee;


这是我的 application.properties:

#Server
server.port=9975
# H2
spring.h2.console.enabled=true
spring.h2.console.path=/h2
# Datasource
spring.datasource.url=jdbc:h2:file:./fileOrDbName
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.driver-class-name=org.h2.Driver

还有我的data.sql:

DROP TABLE IF EXISTS TBL_EMPLOYEES; CREATE TABLE TBL_EMPLOYEES (id INT AUTO_INCREMENT  PRIMARY KEY, first_name VARCHAR(250) NOT NULL, last_name VARCHAR(250) NOT NULL, email VARCHAR(250) DEFAULT NULL); INSERT INTO TBL_EMPLOYEES (first_name, last_name, email) VALUES ('Lokesh', 'Gupta', 'abc@gmail.com'), ('Caption', 'America', 'cap@marvel.com');

应用程序启动正常,我可以通过localhost:9975/h2 访问数据库控制台,但控制器 crud 似乎没有访问数据库。有什么想法吗?

【问题讨论】:

从浏览器运行 localhost:9975/getAllEmployees 会发生什么? 它打印出一个空列表而不是员工列表,因此对我来说,这表明 crudrepo 没有与数据库通信? @georgesvan 您的存储库似乎运行良好。我的客人是你的数据库是空的。您可以通过在 H2 数据库控制台中运行 SELECT * FROM TBL_EMPLOYEES 来检查 是的,我已经完成了,我可以看到 3 个条目,它们是我包含在 data.sql 文件中的条目 howtodoinjava.com/wp-content/downloads/… 是完全相同的员工应用程序。我下载了它,它可以工作。 【参考方案1】:

发现问题。这是因为我没有用@Column(name="..") 注释实体类中的字段,也没有用Table(name="TBL_EMPLOYEES") 注释类。还需要在application.properties文件中添加以下内容spring.jpa.hibernate.ddl-auto=none spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

【讨论】:

很高兴您找到了解决方案。如果您的变量命名与表字段名称相似,也无需将@Column 添加到所有字段。

以上是关于CrudRepository 无法在 h2 db 上执行任何查询的主要内容,如果未能解决你的问题,请参考以下文章

无法查看 grails 项目中使用的 h2 db

将 h2 数据库从 h2.db 转换为 mv.db

查看test.h2.db(H2数据库)的工具[关闭]

SQLGrammarException:无法准备语句

docker 容器中的 H2 DB

以编程方式设置 H2 DB