我正在使用 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/