首页 > 解决方案 > Spring JPA Data ManyToOne 列排序与子实体属性,也允许空值

问题描述

有两个表,例如 Employee 和 Address 实体。我需要按地址实体国家名称排序。我使用过按
国家名称排序的“address.country”。但是在 Employee 表中删除空地址行。需要保留 address_pk 为空的行以及基于国家名称的排序行

@Entity
@Table(name = "employee")
public class Employee {
    private Address address;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "address_pk", nullable = true)
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

标签: javaspringhibernatejpaspring-data-jpa

解决方案


如果您使用这样的 JPA 默认方法:

employeeRepository.findAll(sort);

那么自动生成的查询将使用内部连接。因此,员工没有地址引用的所有行都将从结果中排除。

您必须创建一个自定义查询,例如:

@Query(value="select e from Employee e LEFT JOIN e.address a ORDER BY a.country");
Page<Employee> findAllSorted();

推荐阅读