如何基于Employee表部分字段构建实体并使用Repository查询?
仅映射部分表字段的实体类与Repository实现方案
当然可以实现,以下是两种实用方案,适配不同场景:
方案1:自定义仅含目标字段的实体类
如果确定长期只需要employeeId和lastname这两个字段,直接创建只映射这两个字段的实体类即可:
编写实体类
标注@Entity和对应表名,只声明需要的字段,主键记得用@Id标记:@Entity @Table(name = "Employee") public class SimpleEmployee { @Id private Long employeeId; private String lastname; // 空构造方法(JPA要求)、带参构造、getter/setter public SimpleEmployee() {} public SimpleEmployee(Long employeeId, String lastname) { this.employeeId = employeeId; this.lastname = lastname; } public Long getEmployeeId() { return employeeId; } public void setEmployeeId(Long employeeId) { this.employeeId = employeeId; } public String getLastname() { return lastname; } public void setLastname(String lastname) { this.lastname = lastname; } }编写Repository接口
继承JpaRepository(或CrudRepository),直接写派生查询方法,JPA会自动基于实体类的字段生成对应SQL,只会查询employeeId和lastname:public interface SimpleEmployeeRepository extends JpaRepository<SimpleEmployee, Long> { // 根据lastname查询匹配的记录 List<SimpleEmployee> findByLastname(String lastname); // 根据employeeId和lastname精准查询 Optional<SimpleEmployee> findByEmployeeIdAndLastname(Long employeeId, String lastname); }注意:如果要对这个实体做写入操作,需确保表中未映射的字段要么允许为空,要么有默认值,否则会触发数据库约束报错;如果只做查询操作,就没有这个顾虑。
方案2:使用投影复用原有实体(已有完整实体时)
如果项目里已经存在包含所有字段的Employee实体,不想重新创建新实体,用投影可以灵活获取部分字段:
定义投影接口
接口中只声明需要字段的getter方法:public interface EmployeeProjection { Long getEmployeeId(); String getLastname(); }修改原有Repository
在已有的EmployeeRepository中添加返回投影类型的派生查询方法:public interface EmployeeRepository extends JpaRepository<Employee, Long> { List<EmployeeProjection> findByLastname(String lastname); Optional<EmployeeProjection> findByEmployeeId(Long employeeId); }这种方式下,JPA生成的SQL只会选取投影接口中定义的两个字段,返回的是实现了该接口的代理对象,同样能满足你只使用目标字段的需求。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

