使用带有参数的jdbcTemplate.query

问题描述

我在数据库讲座中有3个表--组。 我想在某一天获得某个小组的时间表。我尝试通过这种方式做到这一点:

@Repository
public class Schedule {

    private static final String GET_GROUP_DAY_SCHEDULE = "SELECT * FROM LECTURES " +
            "INNER JOIN LECTUREGROUPS ON LECTURES.ID = LECTUREGROUPS.LECTUREID " +
            "INNER JOIN GROUPS ON GROUPS.ID = LECTUREGROUPS.GROUPID " +
            "WHERE GROUPID = :GROUPID AND DATE = :DATE";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Lecture> getGroupDayLectures(int groupId,LocalDateTime dateTime) {
        MapsqlParameterSource parameters =  new MapsqlParameterSource()
                .addValue("groupid",groupId)
                .addValue("date",dateTime);
        return jdbcTemplate.query(GET_GROUP_DAY_SCHEDULE,new BeanPropertyRowMapper<>(Lecture.class),parameters);
    }
}

但是我在原始查询中遇到了异常

Caused by: org.postgresql.util.PsqlException: Can't infer the sql type to use for an instance of org.springframework.jdbc.core.namedparam.MapsqlParameterSource. Use setobject() with an explicit Types value to specify the type to use.

我该如何解决? 我还使用了变体

private static final String GET_GROUP_DAY_SCHEDULE = "SELECT * FROM LECTURES " +
            "INNER JOIN LECTUREGROUPS ON LECTURES.ID = LECTUREGROUPS.LECTUREID " +
            "INNER JOIN GROUPS ON GROUPS.ID = LECTUREGROUPS.GROUPID " +
            "WHERE GROUPID = ? AND DATE = ?";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Lecture> getGroupDayLectures(int groupId,LocalDateTime dateTime) {
        return jdbcTemplate.query(GET_GROUP_DAY_SCHEDULE,new Object[]{groupId,dateTime},new BeanPropertyRowMapper<>(Lecture.class));
    }

它可以工作,但仅返回列表中的1个演讲(必须为3个)

解决方法

jdbcTemplate类中有一个带有参数的签名:

public <T> List<T> query(String sql,RowMapper<T> rowMapper,@Nullable Object... args)

因此以这种方式使用它非常容易

private static final String GET_GROUP_DAY_SCHEDULE = "SELECT * FROM LECTURES " +
            "INNER JOIN LECTUREGROUPS ON LECTURES.ID = LECTUREGROUPS.LECTUREID " +
            "INNER JOIN GROUPS ON GROUPS.ID = LECTUREGROUPS.GROUPID " +
            "WHERE GROUPID = ? AND DATE = ?";

    @Autowired
    private JdbcTemplate jdbcTemplate;

    public List<Lecture> getGroupDayLectures(int groupId,LocalDate date) {
        return jdbcTemplate.query(GET_GROUP_DAY_SCHEDULE,new BeanPropertyRowMapper<>(Lecture.class),groupId,date);
    }