我有一个实体
@Getter
@Setter
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "employees")
public class EmployeeEntity implements Persistable<String> {
@Id
@Column("id")
private String id;
@Column("photo_url")
private String photoUrl;
@Column("description")
private String description;
@Transient
private UserEntity user;
@Transient
private boolean isNew = false;
}
和
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "users")
public class UserEntity implements Persistable<String> {
@Id
@Column(value = "id")
private String id;
@Deprecated
@Column(value = "name")
private String name;
@Column("first_name")
private String firstName;
@Column("last_name")
private String lastName;
@Transient
private boolean isNew = false;
}
但是当我尝试让所有员工都进行这样的分页时
@Query("""
SELECT *
FROM employees e
LEFT JOIN users u ON e.user_id = u.id
WHERE e.dealer_id = :id
""")
Flux<EmployeeEntity> findAllByDealerId(String id, Pageable pageable);
Employee 中的 User 始终为 null。
Pageable 可以包含来自两个实体的排序关键字,这就是我需要连接这些表的原因。如果有人知道为什么 user 总是为 null 或者有人知道另一种让员工拥有 user 和可分页的方法,那就太好了:)
Spring Data R2dbc/R2dbc 不支持 JPA 那样的一对一、一对多关系,对于复杂的查询我建议使用 jOOQ 代替,jOOQ 已经添加了 R2dbc 支持。我们在生产中使用 jOOQ 进行 R2dbc 已有两年多了。
检查我的 jOOQ 查询示例项目,其中包含一对多关系, https://github.com/hantsy/spring-r2dbc-sample/blob/master/jooq/src/main/java/com/example/demo/DemoApplication.java#L174-L213