SpringJPA中多表关联查询并返回自定义dto带分页

如题:要实现SpringJPA中多表关联查询并返回自定义dto带分页功能,使用SpringJAP的查询时暂时没找到合适的方法,也不想强制去给实体间做关联,于是有如下代码:

一、建立自己需要返回的dto(这里要注意一点:dto的属性必须和你的查询语句的字段属性一致,否则会报错)


/**
 * 设备备品备件信息Dto数据对象信息类
 * 
 **/
@Data
public class ZiYuanBeiJianDto  implements Serializable {
    /**
     * 主键id<br>
     */
    private String id;

    /**
     * 备件id
     */
    private String beiJianId;

    /**
     * 备件名称
     */
    private String beiJianName;

    /**
     * 备件型号
     */
    private String beiJianXingHao;

    /**
     * 备件单位
     */
    private String beiJianUnits;

    /**
     * 应备数量
     */
    private Float yingBeiNum;

    /**
     * 库存数量
     */
    private Float kuCunNum;


    /**
     * 备注
     */
    private String beiZhu;

    /**
     * 设备id
     */
    private String pid;
}

二、定义Service层接口方法:


/**
 *  这是业务层实现接口
 *  
 */
public interface ZiYuanBeiJianService {



    /**
     * 
     * @param pageNo 起始页
     * @param pageSize 每页最大条数
     * @param params 查询参数
     * @return 返回查询结果
     */
    Page<ZiYuanBeiJianDto> findZiYuanBeiJianByPage(int pageNo, int pageSize, ZiYuanBeiJianDto params);



}

三、Service层接口实现


/**
 *   这是业务层实现类
 *   
 * */
@Service
public class ZiYuanBeiJianServiceImpl implements ZiYuanBeiJianService {
    @Autowired
    private ZiYuanBeiJianRep ziYuanBeiJianRep;
    @Autowired
    private BeiJianKuCunRep beiJianKuCunRep;

    @PersistenceContext
    private EntityManager entityManager;




    @Override
    public Page<ZiYuanBeiJianDto> findZiYuanBeiJianByPage(int pageNo, int pageSize, ZiYuanBeiJianDto ziYuanBeiJianDto) {
        String pid = ziYuanBeiJianDto.getPid();
        if (StringUtils.isBlank(pid)) {
            pid = "-1";
        }
        Pageable pageable = PageRequest.of(pageNo-1, pageSize);
        StringBuilder countSelectSql = new StringBuilder();
        countSelectSql.append(" SELECT count(1) FROM ");
        countSelectSql.append(" syzy_ziyuanbeijian a LEFT JOIN syzy_beijiankucun b ON a.beiJianId=b.id ");


        StringBuilder selectSql = new StringBuilder();
        selectSql.append(" SELECT a.*,b.kuCunNum FROM syzy_ziyuanbeijian a LEFT JOIN syzy_beijiankucun b ON a.beiJianId=b.id ");
        Map<String, Object> params = new HashMap<>();
        StringBuilder whereSql = new StringBuilder();
        whereSql.append("  WHERE a.pid = :pid ");

        params.put("pid", pid);

        //====================拼装查询条件====================//
//        String qcolumnName = ziYuanBeiJianDto.getQcolumnName();
//        String qcolumnValue = ziYuanBeiJianDto.getQcolumnValue();
//        if (StringUtils.isNoneBlank(qcolumnName, qcolumnValue)) {
//            whereSql.append(" AND a." + qcolumnName + " like :" + qcolumnName + " ");
//            params.put(qcolumnName, "%" + qcolumnValue + "%");
//        }
        //增加你的查询条件
        if(StringUtils.isNoneBlank(ziYuanBeiJianDto.getBeiJianName())){
            whereSql.append(" AND a.beiJianName like :beiJianName");
            params.put("beiJianName", "%" + ziYuanBeiJianDto.getBeiJianName() + "%");
        }
        String orderSql = "  order by a.createTime asc ";
        String countSql = new StringBuilder().append(countSelectSql).append(whereSql).toString();
        Query countQuery = this.entityManager.createNativeQuery(countSql);

        for (String key : params.keySet()) {
            countQuery.setParameter(key, params.get(key));
        }


        BigInteger totalCount = (BigInteger) countQuery.getSingleResult();
        String querySql = new StringBuilder().append(selectSql).append(whereSql).append(orderSql).toString();

        Query query = entityManager.createNativeQuery(querySql);
        for (String key : params.keySet()) {
            query.setParameter(key, params.get(key));
        }
        query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(ZiYuanBeiJianDto.class));

        query.setFirstResult((int) pageable.getOffset());
        query.setMaxResults(pageable.getPageSize());
        List<ZiYuanBeiJianDto> resultList = query.getResultList();
        Page<ZiYuanBeiJianDto> page = new PageImpl<>(resultList, pageable, totalCount.longValue());
        return page;
    }







}

剩下的就是controller调用service了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值