我正在使用Spring JDBC,但是我不确定如何使用多个一对多关系(或多对多关系)。在这种情况下,我正在将一个存储库注入(inject)到我的一个结果计算器中,以便可以检索其关联。这是这样做的方法吗?不好吗还有其他更好的方法吗?

注意:我没有注入(inject)存储库

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;

  }
}

Okey,所以在阅读Dmytro Polivenok答案之后,我改为使用RowMapper界面,并且我目前正在使用其他存储库来填充所有关联,如我在示例中所示。这是一个好方法吗?

最佳答案

我认为,一般来说,Spring JDBC和SQL查询的一个好习惯是对每个实体使用一个查询。

例如。假设此模型:

  • 客户(customerId,姓名,年龄等)
  • 地址(customerId,类型,街道,城市等)
  • PaymentOption(客户ID,卡号,卡类型等)
  • 客户1 --- *地址
  • 客户1 --- * PaymentOption

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

    带有readCustomerData(客户或列表)的
  • CustomerDao
  • 具有readAddressForCustomer(客户或列表)的AddressDao
  • 带有readPaymentOptionsForCustomer(客户或列表)的
  • PaymentOptionDao

  • 如果要在1个查询中进行烘烤,则必须建立一些逻辑来还原笛卡尔积。
  • 即如果客户有3个地址和2个付款选项,则查询将返回6行。
  • 如果Address或PaymentOption没有自己的主键,这将变得非常困难。

  • 对于许多人:
  • 客户*-推荐-*产品

  • 我可能会建立:
  • CustomerDao.readRecommendationsAndProductKeys
  • getDistinctListOfProductKeysFromRecommendations
  • ProductDao.readProducts
  • replaceProductKeysByProductsOnRecommendations

  • 这样,您可以重复使用ProductDao.readProducts用于
  • 客户*-购买-*产品或
  • 产品组1 --- *产品
  • 07-27 18:44