我正在使用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()
当然是无效的,但是我可以实现吗?
答案 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
)的别名。