【问题标题】:Map Custom JdbcTemplate query result in an Object将自定义 JdbcTemplate 查询结果映射到对象中
【发布时间】:2020-08-17 15:32:09
【问题描述】:

我是java新手,尝试使用spring框架。我有个问题。 例如,我有表:

  1. 员工(id_employee,姓名)
  2. employee_product(id_employee_product、id_employee、product_name)

如果我从 Employee 表中选择一个员工数据,我可以将其映射到 POJO 模型 User 中并在该模型中定义表结构,如下所示:

public class Employee {
    private final int id_employee;
    private final String nama;

    public Employee(int id_employee, String nama){
        this.id_employee = id_employee;
        this.nama = nama;
    }

    public int getId() {
        return id_employee;
    }

    public String getNama() {
        return nama;
    }
}

这是来自 jdbcTemplate 的地图:

final String sql = "SELECT id_employee, nama FROM employee";
return jdbcTemplate.query(sql, (resultSet, i) -> {
    return new Employee(
            resultSet.getInt("id_employee"),
            resultSet.getString("nama")
    );
});

这是从 1 个表中选择数据的明确示例。

我的问题是,如果我的数据是自定义查询,如何从查询中映射数据?这样我们使用连接并从该表中选择自定义字段,我是否需要为每个查询创建 POJO?

有时我只需要从员工表中选择 employee.id_employeeemployee.name 字段。

在另一个控制器中,我需要从employee 表中选择employee.id_employee

在另一种情况下,我只需要选择employee.nameemployee_product.product_name

是否有替代方法来映射数据而不为每个案例创建 POJO?

【问题讨论】:

  • 您可以使用 JPA 来访问数据。在此处查看详细信息spring.io/guides/gs/accessing-data-jpa
  • 请看jooq.org那里每个查询都会返回一条记录
  • 查询不重要,结果重要。您不需要映射您在查询中使用的每个表,您只需要映射您的选择的最终结果。
  • @M.Deinum 你能举个例子吗?
  • @Eklavya 好的,但怎么做?可以举个例子吗?

标签: java mysql spring spring-boot jdbctemplate


【解决方案1】:

创建一个 POJO,像这样组合两个表

public class Employee {
    private int id_employee;
    private String name;
    private int id_employee_product.
    private String product_name

    //getter and setters  
    //Don't create a constructor its Entiry
}

现在使用BeanPropertyRowMapper Doc Link 编写您的存储库,如下所示

public List<Employee> fetchEmployeeProduct(){
    JdbcTemplate jdbcTemplate = new JdbcTemplate("Your_DataSource");
    StringBuilder query = new StringBuilder();
    query.append("Your Query");
    List<Employee> employeeProductList = 
        jdbcTemplate.query(query.toString(), new BeanPropertyRowMapper<Employee>(Employee.class));
}

确保查询中的SELECT 子句和Employee POJO 的文件名相同。

一旦您执行查询,它将自动映射到 POJO。您无需编写自定义映射器 BeanPropertyRowMapper 将负责映射。

【讨论】:

  • 谢谢,我已经尝试过使用您的解决方案并且它有效。但是,如果我只选择id_employeeproduct_name 并映射到那个POJO,那么我们id_employee_productid_employee 等其他字段的值为0。这是正常的吗?但无论如何,这项工作,谢谢
  • @AdiSparta 是的。这是正常的 。您可以忽略这些值。
猜你喜欢
  • 2012-04-28
  • 2020-04-02
  • 2016-09-22
  • 2019-05-23
  • 1970-01-01
  • 2014-02-11
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多