spring-data-jpa 的DTO查询
spring-data-jpa 的DTO查询
之前在需要dto的时候,要么采用querydsl的投影查询,要么查出一个完整实体数据后再向dto中set值,这两种方式都比较多的代码书写量。
今天公司的大神教我一个方法,在这里记录一下,仅供大家参考,如果有错误,请及时告知,我将虚心修改。嘿嘿。下面开始正文:
querydsl的投影查询
public List<OrgVo> findOrgVosByPid(String pid) {
QOrg qOrg = QOrg.org;
BooleanBuilder builder = new BooleanBuilder();
builder.and(qOrg.delFlag.eq(0));
builder.and(qOrg.pid.eq(pid));
QBean<OrgVo> bean = Projections.bean(OrgVo.class, qOrg.id, qOrg.code, qOrg.name, qOrg.enterpriseLink, qOrg.legalPerson, qOrg.tel, qOrg.address, qOrg.pid, qOrg.orderNum,
qOrg.category, qOrg.enterpriseInfo, qOrg.attId, qOrg.des, qOrg.type);
JPAQuery<OrgVo> query = queryFactory.select(bean).from(qOrg).where(builder).orderBy(qOrg.createTime.desc());
return query.fetch();
}
采用spring-data-jpa 的DTO查询
1,首先,创建一个DTO
OrgVo代码如下:
package mytest.com.common.vo;
import lombok.Value;
@Value
public class OrgVo {
private String id;
private String code;
private String name;
private String enterpriseLink;
private String legalPerson;
private String tel;
private String address;
private String pid;
private String category;
private String attId;
private Integer type;
}
2,在orgDao中声明一个泛型接口
orgDao代码如下:
@Repository
public interface OrgDao extends JpaSpecificationExecutor<Org>, JpaRepository<Org, String>, PagingAndSortingRepository<Org, String> {
List<Org> findByDelFlagAndCode(Integer delFlag, String code);
<T> Collection<T> findByPidAndDelFlag(String pid, Integer delFlag, Class<T> type);
}
3,在service中调用这个泛型方法查询
public List<OrgVo> findOrgVo(String pid) {
List<OrgVo> list = new ArrayList<>();
Collection<OrgVo> collection = orgDao.findByPidAndDelFlag(pid,0,OrgVo.class);
if (CollectionUtils.isNotEmpty(collection)) {
list = collection.stream().collect(Collectors.toList());
}
return list;
}
注意:
其中,OrgVo要加@Value注释,并且,其属性必须都是Org的部分数据库字段,不能含有其他属性或者Org中被标记为@Transient的属性,否则会报错。
这种查询,适用于微服务等场景,比如微服务中,某个服务只需要实体中部分字段。
目录 返回
首页