Hibernate 自定义查询sql 并使用自定义对象接收查询结果

您所在的位置:网站首页 hql使用in进行列表查询 Hibernate 自定义查询sql 并使用自定义对象接收查询结果

Hibernate 自定义查询sql 并使用自定义对象接收查询结果

#Hibernate 自定义查询sql 并使用自定义对象接收查询结果| 来源: 网络整理| 查看: 265

在很多的生产中,hibernate并不能满足我们所有的开发需求,比如,很多表的联合查询,并且查询之后的各种结果封装在自定义的dto对象中,那么我们就需要使用自定义的sql进行查询了,好了,开始我们新的旅程吧。

需求: n张表进行联合查询将结果封装在一个DTO的对象中 代码:

本文中使用了一个很复杂的联合查询的sql,所以大家并不需要了解详细,只需要只是我们进行一个很复杂的多张表进行联合查询的操作,最后将结果使用自定义的dto对象接收即可

SQL SELECT p9.projectId, p9.fenxiaoMoney, p9.shopCount FROM ( SELECT p8.projectId, p8.fenxiaoMoney, count(ic.inviteByPerson) shopCount FROM ( SELECT p7.projectId, p7.fenxiaoMoney FROM ( SELECT pp.projectId, g.fenxiaoMoney FROM ( SELECT p6.projectId FROM ( SELECT p5.projectId FROM ( SELECT p4.projectId FROM ( SELECT p2.projectId FROM ( SELECT p1.projectId FROM ( SELECT p.projectId FROM t_projects p WHERE 1 = 1 AND p.averagePrice >= 1.0 AND p.averagePrice = 1.0 AND p.saleLongitude = 1.0 AND p.saleLatitude = 1.0 AND p.buildArea = 1.0 AND p.averagePrice = 1.0 AND p.saleLongitude = 1.0 AND p.saleLatitude = 1.0 AND p.buildArea //未收藏 sb.append(" != "); } sb.append(" nc.beCollectId "); sb.append(" GROUP BY "); sb.append(" p9.projectId "); } if(!isEmpty(param.getOrderType()) && param.getOrder() != null){ sb.append(" ORDER BY "); if(param.getOrderType().equals(ShopSearchConstant.ORDER_TYPE_SHOP_COUNT)){//合作门店数量 sb.append(" p9.shopCount "); }else if(param.getOrderType().equals(ShopSearchConstant.ORDER_TYPE_MONEY)){//及时结款率 - 暂无 sb.append(" p9.shopCount ");//暂无,暂时用这个替代 }else if(param.getOrderType().equals(ShopSearchConstant.ORDER_TYPE_COMMISSION)){//佣金高低 sb.append(" p9.fenxiaoMoney "); } sb.append(param.getOrderType()); if(param.getOrder() == 0){ sb.append(" DESC "); }else{ sb.append(" ASC "); } } if(page != null){ sb.append(" LIMIT " + page.getStart() + "," + page.getLimit()); } } Service 层 //这个方法是将反射之后得到的字段类型和字段名称进行拆分 private void invokeDtoToFieldsToArray(Field[] fields, String[] colums, String[] types){ for (int i = 0; i < fields.length; i++) { types[i] = fields[i].getType().toString().replace("class java.lang.", ""); colums[i] = fields[i].getName(); } }

下面的方法就是整个Service中的核心方法了,将自定义sql交给hibernate进行处理,并且使用自定义的dto对象进行封装

//这个方法就是将sql进行查询 @Override public void findProjectListByShopSearchParam(ShopSearchParam shopSearchParam, Page page, User user) { StringBuilder sb = new StringBuilder(); // 利用反射获取Project组装类的所有的字段和类型 Field[] fields = ProjectMapListDTO.class.getDeclaredFields(); String[] colums = new String[fields.length]; String[] types = new String[fields.length]; this.invokeDtoToFieldsToArray(fields, colums, types); this.jointHqlTheP9(shopSearchParam, user, sb, page); //返回的结果 List rsList = new LinkedList(); //当前用户所有收藏的项目 List collList = this.findNewCollectRecordByUserId(user.getUserId(), ShopSearchConstant.COLLECT_TYPE_PROJECT,null); //当前门店所有的申请 List appList = this.findApplyChartsByShopId(user.getParentId(), null); //---------重要---------这个就是关键方法 List list = baseDao.queryDTOBySql(sb.toString(), ProjectMapListDTO.class, colums, types); //这里是工作需要,将查询出来的结果进行再次封装--看需要吧 //需要进行判断是否收藏和申请状态的判断 for (ProjectMapListDTO pd : list) { ProjectMapTotalDTO ptd = new ProjectMapTotalDTO(); Project project = (Project) baseDao.loadById(Project.class, pd.getProjectId()); ptd.setProject(project); ptd.setFenxiaoMoney(pd.getFenxiaoMoney()); ptd.setShopCount(pd.getShopCount()); //判断是否已经被收藏 boolean flag = false; for(NewCollectRecord nr : collList){ if(nr.getBeCollectId().equals(pd.getProjectId())){ flag = true; } } //查看合作关系 for(ApplyChart ac : appList){ if(pd.getProjectId().equals(ac.getApplyForPerson())){ ptd.setApplyStatus(ac.getApplyStatus()); } } ptd.setIsLike(flag ? 1 : 0); rsList.add(ptd); } page.setRoot(rsList); List lz = this.findProjectListForMapNew(shopSearchParam, user); page.setTotal(lz.size()); }

看看DTO对象

package com.sc.tradmaster.service.shop.impl.dto; public class ProjectMapListDTO { private String projectId; private Double fenxiaoMoney; private Integer shopCount; //省略set和get方法 } DAO核心方法 public class BaseDaoImpl extends HibernateDaoSupport implements BaseDao{ @Resource public void mySessionFactory(SessionFactory sf){ super.setSessionFactory(sf); } /** * 执行sql组装DTO对象集合 * @param sql * @param clazz * @return */ public List queryDTOBySql(String sql,Class clazz,String[] colums,String[] types) { Session session = super.getSessionFactory().getCurrentSession(); SQLQuery query = session.createSQLQuery(sql); if(colums!=null && types!=null && colums.length==types.length){ for(int i=0;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3