使用CrudRepository仅提取某些字段?

时间:2018-07-18 14:53:21

标签: java spring spring-data

我正在使用CrudRepository从数据库中获取Persons

是否可以使用CrudRepository映射方法从数据库中获取某些字段,而不是整个实体?

示例:我只想提取所有lastname列字段:

interface PersonRepository extends CrudRepository<Person, Long> {
    //of course this is invalid
    List<String> findAllLastname();
}

@Entity
public class Person {
    @Id
    private Long id;


    private String firstname, lastname;
}

findAllLastname()当然是无效的,但是我可以实现吗?

2 个答案:

答案 0 :(得分:2)

为Query注释提供特定的SQL查询应该可以

@Query("select p.lastName from Person  p")
List<Person> getAllLastName();

答案 1 :(得分:0)

您只需执行以下操作即可获取特定字段:

@Query("select p.lastName from Person p")
List<String> getAllLastName();

但是有时候这可能行不通(例如for enum type)。 IMO的最佳方法是使用projection作为返回类型,例如:

public interface PersonProjection {
    String getLastName();
}

@Query("select p.lastName as lastName from Person p")
List<PersonProjection> getAllPersonProjections();

在这种情况下,如果将来您不仅需要获取lastName,还需要获取firstName,则只需更新PersonProjection和查询方法即可:

public interface PersonProjection {
    String getFirstName();
    String getLastName();
}

@Query("select p.firstName as firstName, p.lastName as lastName from Person p")
List<PersonProjection> getAllPersonProjections();

请注意,您应该使用与投影中的吸气剂名称相对应的实体字段(p.firstName as firstName)的别名。