Join 使用Spring行映射器从JDBC结果集填充Collection类型的字段
我正在尝试使用SpringJoin 使用Spring行映射器从JDBC结果集填充Collection类型的字段,join,jdbc,inner-join,spring-jdbc,Join,Jdbc,Inner Join,Spring Jdbc,我正在尝试使用Spring行映射器将JDBCResultSet映射到POJO,如下所示: public class AdvertisementMapper implements RowMapper<Advertisement> { @Override public Advertisement mapRow(ResultSet rs, int rowNum) throws SQLException { Advertisement advertiseme
行映射器将JDBCResultSet
映射到POJO,如下所示:
public class AdvertisementMapper implements RowMapper<Advertisement> {
@Override
public Advertisement mapRow(ResultSet rs, int rowNum) throws SQLException {
Advertisement advertisement = new Advertisement();
advertisement.setId(rs.getLong("id"));
advertisement.setAdvertisementType(AdvertisementType.valueOf(rs.getString("advertisement_type")));
advertisement.setNeed(Need.valueOf(rs.getString("need")));
advertisement.setChildcareWorkerType(ChildcareWorkerType.valueOf(rs.getString("childcare_worker_type")));
advertisement.setChildcareTypes(null);//COLLECTION!
advertisement.setDayToTimeSlots(null);//COLLECTION!
advertisement.setLanguages(null);//COLLECTION!
advertisement.setDescription(rs.getString("description"));
advertisement.setCreationDate(rs.getDate("creation_date"));
advertisement.setExpirationDate(rs.getDate("expiration_date"));
advertisement.setActive(rs.getBoolean("active"));
advertisement.setValidated(rs.getBoolean("validated"));
Member member = new Member();
member.setId(rs.getLong("memberId"));
advertisement.setMember(member);
Address address = new Address();
address.setLat(rs.getDouble("addressLat"));
address.setLon(rs.getDouble("addressLon"));
advertisement.setAddress(address);
advertisement.setFirstAidTraining(Choice.valueOf(rs.getString("first_aid_training")));
advertisement.setGiveBath(Choice.valueOf(rs.getString("give_bath")));
advertisement.setPrepareMeals(Choice.valueOf(rs.getString("prepare_meals")));
advertisement.setHelpWithHomework(Choice.valueOf(rs.getString("help_with_homework")));
advertisement.setCleaningIroning(Choice.valueOf(rs.getString("cleaning_ironing")));
advertisement.setVersion(rs.getInt("version"));
return advertisement;
}
}
我不知道如何从ResultSet
中填充集合/java.util.Set
字段
有人能帮忙吗?由于您没有从结果集中的行到广告
实例的一对一映射,您将无法使用行映射器
完成此操作。您需要使用或
。RowCallbackHandler
的优点是不需要处理调用next()
这是一个非线程安全、不是超级高效但清晰的实现:
class AdvertisementRowcallbackHandler implements RowCallbackHandler {
Map<Long, Advertisement> results = new HashMap<>();
@Override
void processRow(ResultSet rs) SQLException {
long id = rs.getLong("id");
Advertisement advertisement = new Advertisement();
advertisement.setChildcareWorkerTypes(new HashSet<>());
results.putIfAbsent(id, advertisement);
advertisement = results.get(id);
// You could be smart about only setting these if it was absent in the map
advertisement.setId(id);
advertisement.setDescription(rs.getString("description"));
advertisement.getChildcareWorkerTypes().add(rs.getString("worker_type"));
// ...
}
}
类AdvertisementRowcallbackHandler实现RowCallbackHandler{
映射结果=新的HashMap();
@凌驾
无效processRow(结果集rs)SQLException{
long id=rs.getLong(“id”);
广告=新广告();
advision.setChildcareWorkerTypes(新HashSet());
结果:putIfAbsent(id,广告);
广告=结果。获取(id);
//如果地图上没有,你可以聪明地设置这些
advision.setId(id);
advision.setDescription(rs.getString(“description”);
advision.getChildcareWorkerTypes().add(rs.getString(“worker_type”));
// ...
}
}
然后使用newarraylist(handler.results.values())
获得结果
class AdvertisementRowcallbackHandler implements RowCallbackHandler {
Map<Long, Advertisement> results = new HashMap<>();
@Override
void processRow(ResultSet rs) SQLException {
long id = rs.getLong("id");
Advertisement advertisement = new Advertisement();
advertisement.setChildcareWorkerTypes(new HashSet<>());
results.putIfAbsent(id, advertisement);
advertisement = results.get(id);
// You could be smart about only setting these if it was absent in the map
advertisement.setId(id);
advertisement.setDescription(rs.getString("description"));
advertisement.getChildcareWorkerTypes().add(rs.getString("worker_type"));
// ...
}
}