首页 > 解决方案 > 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

解决方案


正如您注意到的那样,Spring Data JDBC 以 1:M 关系加载聚合的效率相当低。

如果您提供自定义查询,RowMapper默认方法也使用相同的查询,因此来自您的连接的列基本上会被忽略,而是执行额外的选择。

但是您可以提供自己的RowMapper,或者在这种情况下更有用ResultSetExtractor,这将允许您利用联接。

请参阅:https://github.com/spring-projects/spring-data-jdbc/blob/master/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/Query。爪哇#L56


推荐阅读