java - Spring JDBC中的多个一对多关系

标签 java spring jdbc spring-jdbc

我正在使用 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
  • AddressDao 与 readAddressForCustomer(客户或列表)
  • PaymentOptionDao 与 readPaymentOptionsForCustomer(客户或列表)

如果您要在 1 个查询中完成此操作,则必须构建一些逻辑来还原笛卡尔积。

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

对于多对多:

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

我可能会 build :

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

像这样你可以重用 ProductDao.readProducts

  • 客户 * --buys-- * 产品或
  • ProductGroup 1---* 产品

关于java - Spring JDBC中的多个一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15494185/

相关文章:

java - 将 ResultSet 中的数据添加到 jTable

mysql - JDBC如何执行 '\. somesqlfile.sql'?

java - jGRASP 支持 Java lambda 表达式吗?

java - 在 Java 中解码十六进制 NCR

java - 在 Spring boot 运行时指定 MongoDb 集合名称

java - Spring-Security-Ldap - 如何报告锁定帐户

java - 如何在libGDX中以相反的方式射击子弹

java - 代码中的文件路径未更改

spring - @PreAuthorize(permitAll) 仍然需要身份验证

java - 如何使用一个数据源以编程方式更改 Spring 中的数据库?