【问题标题】:Thymeleaf How can I display a column from one table based on a value from another tableThymeleaf 如何根据另一个表中的值显示一个表中的列
【发布时间】:2017-09-14 08:43:23
【问题描述】:

我正在做一个尝试学习百里香的小项目。 我有 3 个表 Timetables,其中包含一个 id,作为外键的 assignment id 和其他东西,Assignments 包含和 id 和作为外键的项目 id,以及包含和 id 和项目名称的 Projects。

我需要在 html 中显示时间表,这很简单,但是我想显示项目名称而不是分配 ID 列。

我的服务类中已经有一个选择,它调用所需的列,但是我如何告诉 thymeleaf 读取该列而不是在时间表中查找它。

这是我的代码

html

<table class="table table-bordered">
    <thead>
    <tr>
        <th>id</th>
        <th>assignment</th>
        <th>date</th>
        <th>number of hours</th>
    </tr>
    </thead>
    <tbody>
    <tr th:each="timetable: ${timetables}">
        <td th:text="${timetable.timetableId}">45</td>
        <td th:text="${timetable.assignmentId}">vasi</td>
        <td th:text="${timetable.date}">1 ian</td>
        <td th:text="${timetable.hoursWorked}">3000</td>
    </tr>
    </tbody>
</table>

服务类

@Autowired
JdbcTemplate template;

public List<Timetable> findAll(String loginname) {
    String sql = "  SELECT timetables.timetableId, timetables.assignmentId, timetables.date, timetables.hoursWorked, users.username, projects.projectName FROM timetables INNER join assignments on assignments.assignmentId = timetables.assignmentId INNER JOIN users on users.userId = assignments.userId " +
            "INNER JOIN projects on assignments.projectId = projects.projectId where username= ?";

    RowMapper<Timetable> rm = new RowMapper<Timetable>() {
        @Override
        public Timetable mapRow(ResultSet resultSet, int i) throws SQLException {
            Timetable timetable = new Timetable(resultSet.getInt("timetableId"),
                    resultSet.getInt("assignmentId"),
                    resultSet.getDate("date"),
                    resultSet.getInt("hoursWorked"));

            return timetable;
        }
    };

    return template.query(sql, rm, loginname);
}

控制器

@Autowired
TimetableService service;

@Autowired
AssignmentsService serv;

@RequestMapping(value = {"/Timetable"}, method = RequestMethod.GET)
public String index(Model md) {
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();
    String loginname = auth.getName();
    md.addAttribute("timetables", service.findAll(loginname));
    return "Timetable";
}

【问题讨论】:

    标签: mysql thymeleaf


    【解决方案1】:

    我对 JdbcTemplate 不熟悉,但我认为您需要执行以下操作

    将 projectName 添加到 Timetable 类中(如果您还没有它)并在 mapRow 中

    RowMapper<Timetable> rm = new RowMapper<Timetable>() {
            @Override
            public Timetable mapRow(ResultSet resultSet, int i) throws SQLException {
                Timetable timetable = new Timetable(resultSet.getInt("timetableId"),
                        resultSet.getInt("assignmentId"),
                        resultSet.getDate("date"),
                        resultSet.getString("projectName"),
                        resultSet.getInt("hoursWorked"));
    
                return timetable;
            }
        };
    

    然后,在 html 页面中也添加项目名称

    <tbody>
       <tr th:each = "timetable: ${timetables}">
             <td th:text="${timetable.timetableId}">45</td>
             <td th:text="${timetable.projectName}">vasi</td>
             <td th:text="${timetable.date}">1 ian</td>
             <td th:text="${timetable.hoursWorked}">3000</td>
       </tr>
    </tbody>
    

    【讨论】:

    • 完美运行。非常感谢你。除了上述内容之外,为了将来的参考,我需要在我的模型类中添加一个名为 projects、getter 和 setter 的字段,以及另一个使用字符串项目而不是 assignmentId 的构造函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多