首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spring RowMapper从JDBC填充类型集合的字段

使用Spring RowMapper从JDBC填充类型集合的字段
EN

Stack Overflow用户
提问于 2015-07-14 15:23:23
回答 1查看 623关注 0票数 0

我试图使用Spring ResultSet将JDBC映射到POJO,如下所示:

代码语言:javascript
复制
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;
    }
}

我对三个类型的字段有问题:java.util.Set (我在上面的java代码中向它们添加了一个//COLLECTION!注释)。

下面是SQL:

代码语言:javascript
复制
SELECT * FROM 
advertisement a, 
advertisement_childcare_types act, 
advertisement_day_to_time_slots adtts, 
day_to_time_slot dtts,
advertisement_languages al,
language l
WHERE 
a.id = act.advertisement AND
a.id = adtts.advertisement AND
adtts.day_to_time_slots = dtts.id AND
a.id = al.advertisement AND
al.languages = l.id

我不知道如何从java.util.Set中填充集合/ResultSet字段。

有人能帮忙吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-14 19:15:14

由于您没有从结果集中的行到Advertisement实例的一对一映射,所以您将无法使用RowMapper来完成这一任务。您需要使用RowCallbackHandlerResultSetExtractor<List<Advertisement>>RowCallbackHandler的优点是您不需要处理调用next()的问题。

下面是一个非线程安全,不是超级高效,而是明确的实现:

代码语言:javascript
复制
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"));
    // ...
  }
}

然后您将得到new ArrayList<>(handler.results.values())的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31410804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档