Spring JDBC中的多个一对多关系

Luc*_*uke 14 java spring jdbc spring-jdbc

我正在使用Spring JDBC,我对如何处理多个一对多关系(或多对多关系)有点不确定.在这种情况下,我将一个存储库注入我的resultsetextractors之一,以便我可以检索其关联.这是这样做的吗?这不好吗?还有其他更好的方法吗?

注意:我遗漏了注册库

public class SomeResultSetExtractor implements ResultSetExtractor {

  public Object extractData(ResultSet rs) throws SQLException, DataAccessException {
    List result = new LinkedList();

    while (rs.next()) {
        SomeObject object = new SomeObject(rs.getString(1), rs.getLong(2));
        result.add(object);

        List<AnotherObject> otherObjects = anotherRepository.findAllById(object.getId);
        object.setOtherObjects(otherObjects);
        // and so on
    }

    return result;

  }
}
Run Code Online (Sandbox Code Playgroud)

Okey所以在阅读Dmytro Polivenok之后回答我改为RowMapper界面,而我目前正在使用其他存储库来填充我在我的示例中显示的所有关联.这是一个很好的方式吗?

tkr*_*tkr 5

我认为Spring JDBC和SQL查询的一个好习惯通常是为每个实体使用一个查询.

例如假设这个模型:

  • 客户(customerId,姓名,年龄......)
  • 地址(customerId,类型,街道,城市......)
  • PaymentOption(customerId,cardnumber,cardtype,...)

  • 客户1 ---*地址

  • 客户1 ---*PaymentOption

我将构建3个查询,3个Daos,3个ResultSetExtractors/RowcallbackHandlers:

  • CustomerDao与readCustomerData(客户或列表)
  • 使用readAddressForCustomer(Customer或List)AddressDao
  • PaymentOptionDao with readPaymentOptionsForCustomer(Customer or List)

如果你想在1个查询中烘焙它,你将需要构建一些逻辑来恢复cartasian产品.

  • 即如果客户有3个地址和2个支付选项,则查询将返回6行.
  • 如果Address或PaymentOption没有自己的主键,这会变得非常困难.

对于许多人:

  • 客户*--recommends--*产品

我可能会建立:

  • CustomerDao.readRecommendationsAndProductKeys
  • getDistinctListOfProductKeysFromRecommendations
  • ProductDao.readProducts
  • replaceProductKeysByProductsOnRecommendations

像这样你可以重用ProductDao.readProducts

  • 客户* - 买 - *产品或
  • 产品组1 ---*产品