请求
在 Spring Boot 中,我想运行完全自定义查询,例如运行查询以获取表 person 上的名字和姓氏列。但是表 person 的存在以及它可能具有名字和姓氏列的事实在编译时是未知的。
为什么我要这样做
我想在我们的应用程序中执行此操作,因为我们有自定义字段和自定义实体的概念。这些 View 自动构建在它们之上。在运行时,我会知道哪些 View 可用以及它们有哪些列,但我不会知道应用程序何时启动(并且它们可能会在应用程序运行时发生变化
我不想要什么
crudRepository 上的查询注释,因为它仍然需要针对特定对象,因此不能具有动态字段或任意对象(除非有人知道如何使 crudRepository 做到这一点)
最佳答案
如果您了解运行时所需的实体和字段,则可以使用 SpringJDBC 模板来构造 SQL 查询。下面是获取 Todo
项目的示例。您可以执行类似的操作,但传入实体名称和您想要的字段集合。这是一个非常基本的示例:
@Autowired
private DataSource dataSource; // Configure this in a class annotated with @Configuration
public Todo fetchWithToDoId(long id) {
Todo record = new JdbcTemplate(dataSource).queryForObject("SELECT * FROM PUBLIC.TODO WHERE todo_id = ?", new Object[]{id}, getRowMapper());
return record;
}
private RowMapper<Todo> getRowMapper() {
return (resultSet, i) -> {
Todo d = new Todo();
d.setUserId(resultSet.getInt("todo_user_id"));
d.setId(resultSet.getInt("todo_id"));
d.setTitle(resultSet.getString("todo_title"));
d.setCompleted(resultSet.getBoolean("todo_completed"));
d.setCreated(resultSet.getTimestamp("todo_created"));
return d;
};
}
如果表和列不存在,则会抛出异常,您需要在服务器端处理它们并向客户端呈现适当的 View 。您可能会扩展它以接受实体和 KeyValuePair 数据结构作为参数,以将字段映射到值。当您构建查询时,它将显示所有字段及其目标值。
关于java - 如何在 Spring Boot 中创建完全自定义的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49260053/