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 上执行任何查询的主要内容,如果未能解决你的问题,请参考以下文章