You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Spring Data JPA读取实体类的指定字段

Spring Data JPA 查询指定字段的实现方案

你可以根据业务场景选择以下4种常用实现方式:

1. 接口投影(最轻量化方案)

这是Spring Data JPA原生支持的无额外配置方案,适合只读场景:

  • 第一步:定义仅包含所需字段getter方法的投影接口
// 仅查询姓名的投影接口
public interface PersonNameProjection {
    String getFirstName();
    String getLastName();
}
  • 第二步:在你的PersonRepository中定义返回值为该接口的查询方法即可
public interface PersonRepository extends CrudRepository<Person, Long> {
    // 查询所有用户的姓名
    List<PersonNameProjection> findAllBy();
    // 也可以加查询条件,比如根据姓氏模糊查询匹配的姓名
    List<PersonNameProjection> findByLastNameContaining(String lastNameKeyword);
}

查询时JPA会自动生成只查询对应字段的SQL,返回的是动态代理的接口实例,直接调用getter方法就能取值。

2. DTO构造器投影(适合需要操作查询结果的场景)

如果需要对查询结果做修改、传输等操作,可以用DTO类接收:

  • 第一步:定义DTO类,编写对应参数的构造方法
public class PersonNameDTO {
    private String firstName;
    private String lastName;

    // 注意构造方法的参数顺序、类型要和JPQL中查询的字段完全对应
    public PersonNameDTO(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // getter、setter按需编写
    public String getFirstName() { return firstName; }
    public void setFirstName(String firstName) { this.firstName = firstName; }
    public String getLastName() { return lastName; }
    public void setLastName(String lastName) { this.lastName = lastName; }
}
  • 第二步:在Repository中用@Query编写JPQL,通过new关键字指定DTO全类名构造结果
public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query("select new 你的DTO类完整包名.PersonNameDTO(p.firstName, p.lastName) from Person p")
    List<PersonNameDTO> findAllPersonNames();
}

3. Tuple查询(适合临时查询不想新增类的场景)

如果是临时小范围查询,不想额外定义接口或DTO,可以直接用Tuple接收结果:

public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query("select p.firstName, p.lastName from Person p")
    List<Tuple> findAllPersonNames();
}

取值方式:

List<Tuple> results = personRepository.findAllPersonNames();
for (Tuple tuple : results) {
    String firstName = tuple.get("firstName", String.class);
    String lastName = tuple.get("lastName", String.class);
}

4. 原生SQL查询

如果需要用原生SQL实现,也可以直接指定查询字段,返回Map、Tuple或者投影类都支持:

public interface PersonRepository extends CrudRepository<Person, Long> {
    @Query(value = "select first_name, last_name from PERSON", nativeQuery = true)
    List<Map<String, Object>> findAllPersonNamesNative();
}

内容的提问来源于stack exchange,提问作者cpu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:12:02