spring data jpa返回实体的部分指定字段的方法总结

在使用orm框架的时候,我们需要返回实体的一些指定的字段,不需要全部返回,或者只返回一些复合型的字段

在spring data jpa中如何实现呢?

方法1:定义一个接口,包含要返回的属性的方法即可

public interface EmployeeNameOnly {



    String getLastName();

}

 

public interface EmployeeRepository extends JpaRepository, JpaSpecificationExecutor, EmployeeRepositoryCustom {



    EmployeeNameOnly findById(Long id);



}

效果:

spring data jpa返回实体的部分指定字段的方法总结_第1张图片

原理是运行时底层会有动态代理机制为这个接口生成一个实现实体类

2. 定义Dto实体类

需要哪些字段,直接在Dto类中使用get/set属性即可

public class EmployeeNameOnlyDto {



    private String lastName;



    // 使用entityManage Transformers.aliasToBean 的时候,要有默认的构造函数才可以

    public EmployeeNameOnlyDto(){}



    // 使用dto来获取部分字段内容

    public EmployeeNameOnlyDto(String lastName) {

        this.lastName = lastName;

    }



    public String getLastName() {

        return lastName;

    }



    public void setLastName(String lastName) {

        this.lastName = lastName;

    }

}

 

public interface EmployeeRepository extends JpaRepository, JpaSpecificationExecutor, EmployeeRepositoryCustom {

    @Query(value = "select last_name from tbl_employee order by id desc limit ?1,?2",nativeQuery = true)

    List findLastNamePage(Integer pageNum, Integer pageSize);

}

 

效果:

spring data jpa返回实体的部分指定字段的方法总结_第2张图片

3. 使用entityManager的Transformers.aliasToBean

public List selectPageEmployeeEntityManager2(Employee employee){

    // 这段代码写在这里并不好 所有查询数据库的内容应该都放到EmployeeRepository中

    // 所以应该把这段代码放到EmployeeRepositoryImpl中

    String sql = "select last_name as lastName from tbl_employee order by id desc limit ?,?";

    Query query = entityManager.createNativeQuery(sql);

    query.setParameter(1, (employee.getPageNum() - 1) * employee.getPageSize());

    query.setParameter(2, employee.getPageSize());

    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(EmployeeNameOnlyDto.class));

    List resultList = query.getResultList();

    return resultList;

}

效果:

spring data jpa返回实体的部分指定字段的方法总结_第3张图片

4. 使用entityManager的Transforms.ALIAS_TO_ENTITY_MAP

这样解析出来的map需要我们自己来处理赋值给java bean,适合对字段进行处理,如字段自动加解密

@Override
public List getPageEmployeeMixDto(Employee employee) {
    String sql = "select id,last_name from tbl_employee order by id desc limit ?,?";
    Query query = entityManager.createNativeQuery(sql);
    query.setParameter(1, (employee.getPageNum() - 1) * employee.getPageSize());
    query.setParameter(2, employee.getPageSize());
    query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
    List resultList = query.getResultList();
    List list = new ArrayList<>();
    for (Object o : resultList) {
        EmployeeMixDto employeeMixDto = new EmployeeMixDto();
        HashMap map = (HashMap) o;
        employeeMixDto.setId(IdUtil.getMixId(String.valueOf(map.get("id"))));
        employeeMixDto.setLastName(String.valueOf(map.get("last_name")));
        list.add(employeeMixDto);
    }
    return list;
}

效果:

spring data jpa返回实体的部分指定字段的方法总结_第4张图片

可以看到我们的id字段已经被混淆了

 

源码参考:https://gitee.com/constfafa/spring-data-jpa-demo.git

mybatis中是如何返回部分字段的呢?

其可以通过entitywrapper的select来指定要返回的字段,mybatis中有resultType及resultMap的概念,而在spring data jpa中并不能通过名称方法定义的查询来获取,findLastNameByxxx这种写法是illegal的,所以我们只能通过@query或者entityManager来自己写部分字段查询并进行映射

你可能感兴趣的:(spring,data,jpa)