在 JPA 持久层中,可以自定义接收数据的对象。这通常用于查询操作,其中查询结果不完全匹配现有的实体类,或者需要仅返回某些字段的结果。以下示例,展示如何在 JPA 持久层中自定义接收数据的对象
假设有一个名为 Person 的实体类,包含 id、name 和 age 字段:
@Entity
@Table(name = "person")
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int age;
// 省略构造函数、getter 和 setter 方法
}
现在我们只想查询人员的姓名和年龄,并将结果封装到自定义的数据对象 PersonInfo 中:
public class PersonInfo {
private String name;
private int age;
// 省略构造函数、getter 和 setter 方法
}
第一种方式
@Repository
public class PersonRepository {
@PersistenceContext
private EntityManager entityManager;
public List<PersonInfo> getPersonInfo() {
String query = "SELECT new com.example.PersonInfo(p.name, p.age) FROM Person p";
TypedQuery<PersonInfo> typedQuery = entityManager.createQuery(query, PersonInfo.class);
return typedQuery.getResultList();
}
}
在上面的代码中,我们使用 SELECT new 关键字创建了一个 PersonInfo 对象,并将查询结果映射到该对象。通过使用构造函数,可以选择性地指定要接收的字段。
第二种方式
使用 Spring Data JPA 的 Repository 接口
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
@Query("SELECT new com.example.PersonInfo(p.name, p.age) FROM Person p")
List<PersonInfo> getPersonInfo();
}
在上面的示例中,我们使用了 @Query 注解,并指定了一个自定义的查询语句。在查询语句中,我们使用了 new 关键字创建了一个 PersonInfo 对象,并将查询结果映射到该对象。
注意点
在查询语句中,com.example.PersonInfo 是 PersonInfo 类的完全限定名,确保使用正确的包名,确保创建了对应的构造方法。
本文共 315 个字数,平均阅读时长 ≈ 1分钟
评论 (0)