Join 使用Spring行映射器从JDBC结果集填充Collection类型的字段

Join 使用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

我正在尝试使用Spring
行映射器将JDBC
ResultSet
映射到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"));
    // ...
  }
}