spring-data-jdbc - Spring Data JDBC中的ORM在映射实体时是否支持JOIN?
问题描述
我正在使用 Spring Data JDBC (1.0.10.RELEASE) 实现一对多关系,即一个客户可以有多个订单。执行 JOIN 查询时,我可以在 DEBUG 中看到,在执行 JOIN 查询后,每个 Order 按其ID执行附加查询,以获取看起来完全多余的订单数据。
结果,在返回客户列表时,我得到x结果,其中x是订单数。所以我得到了x 个客户对象,这些对象似乎映射得很好(与订单的一对多关系也被正确映射),但是每个订单都会重复它们。
这是数据库架构:
create sequence seq_customer start 1;
create table customer (
id integer default nextval('seq_customer'),
name varchar(100) not null,
surname varchar(100) not null
constraint pk_customer primary key (id)
);
create sequence seq_customer_order start 1;
create table customer_order (
id integer default nextval('seq_customer_order'),
customer_id integer not null,
created_date timestamp not null,
constraint pk_customer_order primary key (id),
constraint fk_customer_order_id foreign key (customer_id) references customer (id)
);
在 Customer 类中映射外键时,我使用:
@Column("customer_id")
private Set<OrderEntity> orders;
询问:
@Query("SELECT * from customer c JOIN customer_order co ON c.id = co.customer_id")
List<Customer> findCustomers()
我的问题是,Spring Data JDBC 是否完全支持 JOIN?
解决方案
正如您注意到的那样,Spring Data JDBC 以 1:M 关系加载聚合的效率相当低。
如果您提供自定义查询,RowMapper
默认方法也使用相同的查询,因此来自您的连接的列基本上会被忽略,而是执行额外的选择。
但是您可以提供自己的RowMapper
,或者在这种情况下更有用ResultSetExtractor
,这将允许您利用联接。
推荐阅读
- javascript - 尽管 MFP 服务器已关闭,但仍返回访问令牌
- java - datajptest + springframework 测试Sql编码特殊字符在Windows上失败
- excel - 标记所有不包含两个给定单词的单元格
- javascript - 强制 eslint 在某些文件上导入时使用默认导出模块的原始名称
- gauge - getgauge 如何使用 GelAllStepList 获取所有步骤?
- java - 一些 Recyclerview 项目相互影响
- ruby-on-rails - 如何从路由助手中删除资源名称?
- pimcore - 获取 PHP 中 Pimcore v5 的已安装扩展列表
- python - 在 Python 中点击 Rest API 时将响应代码设为 500
- r - 在 R 中加载 h5 keras 模型文件