java - 如何在 Spring Boot 中创建完全自定义的查询

标签 java spring-boot

请求

在 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/

相关文章:

java - Spring Boot sperate @Configurations 用于多个应用程序上下文

java - 使用正则表达式替换java中的querystring属性值

java - 如何访问WEB-INF下文件夹内的jsp页面?

java - 改进代码以保存到数据库

javax.management.InstanceAlreadyExistsException : com. zaxxer.hikari :name=dataSource, 类型=HikariDataSource

java - 当 maven build 运行测试时,Spring boot 项目抛出 *$$EnhancerBySpringCGLIB is not an @AspectJ Aspect

javascript在循环内悬停href时获取参数

java - 如何同步父类上嵌套的Java类方法?

java - Spring Data REST - HAL 浏览器 - 返回 HAL 浏览器 HTML 而不是 API 的根

java - Spring Boot + Hibernate JPA 延迟获取模式仍然查询实体中的列表