问题描述
我在数据库讲座中有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);
}