使用 Spring Data JPA 从数据库表中选择特定列


在某些情况下,我们只需要检索实体的选定属性。本教程解释了如何以不同的方式实现这一目标。
一个 API 返回包含所有属性的所有客户的列表。但通常情况下,不需要获取所有属性。从数据库中只检索所需的数据始终是一个好习惯。这样做的主要原因是为了提高应用程序的性能。下面,我将展示如何以不同的方式从数据库中仅检索一组特定的数据。
 
1. 只选择一个实体的一个属性
该应用程序公开一个端点,该端点仅返回客户的电话号码。当只需要一个属性(字段)时,在存储库接口中创建自定义方法。此方法使用@Query 注释进行注释。这个注解有一个自定义的 JPQL 语句,它只选择指定的属性。

@Query("SELECT phoneNumber FROM CustomerEntity customer"
List<String> findPhoneNumbers();

 
2. 使用自定义 DTO 对象选择实体的特定属性
大多数时候我们需要返回一个实体的多个属性。该应用程序的 API 仅返回客户的全名和地址。类 (DTO) 是使用选定的字段和接受这些字段作为参数的构造函数创建的。存储库接口中的自定义方法返回使用此类创建的对象列表。该方法有一个@Query 注释。此注释有一个 JPQL 查询,该查询从具有选定字段的自定义类创建对象。字段被传递给这个类的构造函数。必须在查询中指定完全限定的类名。
@Query("SELECT new com.polovyi.ivan.tutorial.entity.dto.MailingAddressDTO (fullName, address) FROM CustomerEntity customer"
List<MailingAddressDTO> findMailingAddresses();

 
3. 使用基于接口的投影选择实体的特定属性
检索多个属性的另一种选择是使用基于接口的投影。在这种情况下,接口是使用访问器方法创建的,用于要检索的属性。一个示例应用程序有一个 API,它返回每个客户的全名和工作。该 API 调用存储库,该存储库返回从实现上述接口的类创建的对象列表。Spring 会“即时”处理这个问题。然后在这个方法的@Query注解中,指定了JPQL查询。确保对字段使用别名,因为没有它们将无法工作。
@Query("SELECT fullName AS fullName, customer.job AS job FROM CustomerEntity customer"
List<CustomerJobProjection> findAllJobs();

结论
应用程序的性能非常重要。每个开发人员都必须优化应用程序,使其快速高效。许多方法之一是最小化应用程序和数据库之间的数据传输。它可以通过使用本教程中解释的技术来实现。