这里有两个例子。在实体被加载,并将数据复制到 DTO。在第二个示例中,使用预测查询来最小化数据加载和复制。我已更改原始查询以选择公司名称,因为它不会将雇员职位存储在公司表中。Lombok 注解用于创建 getter/setter 和构造函数。
员工类
@Entity
@Getter
@Setter
public class Employee {
@Id
private Long id;
@Column
private String name;
@Column
private int age;
@ManyToOne
private Company company;
}
公司类
@Entity
@Getter
@Setter
public class Company {
@Id
private Long id;
@Column
private String name;
@OneToMany(cascade = CascadeType.ALL)
private List<Employee> employees;
}
一个简单的 POJO 类 (DTO),用于以我们想要的方式生成 JSON。
@Data
@AllArgsConstructor
public class EmployeeAndCompanyDTO {
String name;
int age;
String companyName;
}
Spring 数据存储库
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}
示例休息控制器
@RestController
public class EmployeeController {
@Autowired
EmployeeRepository employeeRepository;
@ResponseBody
public List<EmployeeAndCompanyDTO> employeeAndCompanyView() {
List<Employee> employee = employeeRepository.findAll();
return employee.stream()
.map(e-> new EmployeeAndCompanyDTO(e.getId(), e.getName(), e.getAge(), e.getCompany().getName()))
.collect(Collectors.toList());
}
}
如果您想避免加载所有数据,而只加载您需要的列,您可以在存储库中使用自定义投影查询:
@Repository
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query("select new com.example.EmployeeAndCompanyDTO(e.id, e.name, e.age, e.company.name) from Employee e")
List<EmployeeAndCompanyDTO> employeeAndCompanyView();
}
编写投影查询有点棘手(取决于您的 IDE 支持),但您加载的数据更少,并且无需在控制器/服务类中从实体转换为 DTO。