Spring Boot 和 Thymeleaf 问题 - 模型特定查询

问题描述 投票:0回答:1

我是 Spring Boot 和 Thymeleaf 的初学者,我有一个问题,如果有经验丰富的开发人员可以帮助我,我将不胜感激!我有一个 EmployeeController -> EmployeeService -> EmployeeRepository 设置!目前我有一个 getMapping 来检索员工!下面是我的课程:

员工控制器:

@GetMapping("/find")
    public String findEmployee(@RequestParam("employeeId") int theId, Model model) {

        Employee employee = employeeService.findById(theId);

        model.addAttribute("employee", employee);

        return "/employees";

    }

因此,通过上述操作,我可以使用 Thymeleaf 上的“employee”属性访问该对象

th:object="${employee}

但是,如何将 ab 对象作为模型中的属性传递,而我没有实体类?

例如,假设我有一个 getMapping 方法,该方法返回一个复杂的查询,例如按销售额获取产品的前 5 个 SKU,并且其表结果将有一列 sku 和unit_sold!上面的 getMapping,

employeeService.findById(theId)
返回一个“Employee”类型,我能够捕获它,因为我有一个 Employee 类!我能够将员工添加到模型属性中以在 Thymeleaf 中使用它!

但是对于复杂的查询,我没有对应的类,我将无法捕获它!我如何将它作为模型属性传递,以便我可以将它用作 Thymeleaf 中的对象?我是否必须创建一个像下面这样的类并捕获它并将其作为属性传递到模型中?

public class Employee {

    private String sku;
    private int unitSold;

}

如有任何建议,我们将不胜感激

我尝试创建一个实体类只是为了结果但不起作用

java spring spring-boot controller thymeleaf
1个回答
0
投票

解决方案1

在这些情况下,一般最佳实践是使用 DTO(数据传输对象)。

假设您的 Employee 模型如下所示:

    public class Employee {

    private String sku;
    private int unitSold;
    private String name;
    private String age;
}

但是你想给 thymeleaf 一个不同的模型,就像这个:

    public class EmployeeDto {

    private String sku;
    private int unitSold;
    private LocalDate startOfPeriod;
    private LocalDate endOfPeriod;
}

您可以使用此 DTO 类添加到 Thymeleaf 模型。

您也不需要存储库类,您可以使用JdbcTemplate用于SQL或MongoTemplate用于MongoDB来查询Dto

   public class EmployeeService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<EmployeeDto> getAllSales() {
        String sql = "SELECT sku, unit_sold, start_of_period, end_of_period FROM sales_data";

        return jdbcTemplate.query(sql, salesRowMapper());
    }

    private RowMapper<EmployeeDto> salesRowMapper() {
        return (rs, rowNum) -> {
            EmployeeDto salesData = new EmployeeDto();
            salesData.setSku(rs.getString("sku"));
            salesData.setUnitSold(rs.getInt("unit_sold"));
            salesData.setStartOfPeriod(rs.getObject("start_of_period", LocalDate.class));
            salesData.setEndOfPeriod(rs.getObject("end_of_period", LocalDate.class));
            return salesData;
        };
    }
   }

或使用 MongoDB 和 MongoTemplate

    @Autowired
    private MongoTemplate mongoTemplate;

    public List<EmployeeDto> getAllSales() {
        // Assuming the collection name is 'employee'
        List<EmployeeDto> salesData = mongoTemplate.findAll(EmployeeDto.class, "employee");
        return salesData;
    }

然后可以像平常一样将其添加到 thymeleaf 模板引擎中

model.addAttibute("employeeDto", this.employeeService.getAllSales());

这被认为是最直接的解决方案。

解决方案2

此问题的另一种不需要 dto 的解决方案是使用 Jdbc 或 Mongo 模板来获取结果作为 Map

    public String getAllSales() {
        String sql = "SELECT * FROM sales"; // Adjust SQL query as needed

        // Execute the query and retrieve the result as a list of maps
        List<Map<String, Object>> salesData = jdbcTemplate.queryForList(sql);
        return salesData; 
    }
    public String getAllSales() {
        // Query without criteria to fetch all documents
        Query query = new Query();

        // Execute the query and retrieve the result as a list of maps
        List<Map> salesData = mongoTemplate.find(query, Map.class, "sales");

        return salesData;
    }

我个人建议使用 Dto,但这也是一个有效的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.