第一种 NamedQuery(返回方式为列模式[原生态sql的复杂查询])
1)dao层处理查询并分页
@SuppressWarnings("unchecked") public PageResult<T> getList(Integer currentPage){ PageResult<T> pageResult = new PageResult<T>(); int pageSize = Constant.DEFAULT_PAGE_SIZE; int start = (currentPage - 1) * pageSize; Query query = getEntityManager().createNamedQuery("ReturnTrainAppyUser"); int total = query.getResultList().size(); // 判断分页 if (start < total && pageSize > 0) { query.setFirstResult(start); query.setMaxResults(pageSize); pageResult.setFirst(start); pageResult.setPageSize(pageSize); } pageResult.setTotalCount(total); pageResult.setPageResultList(query.getResultList()); return pageResult; }
2)控制层代码
@RequestMapping("/applyList") public String applyList(HttpServletRequest request, HttpServletResponse response, Model model) throws Exception { Integer currentPage = 1; Integer pageNum = getIntParameter(request, "pageNum"); if (pageNum != null) { currentPage = getIntParameter(request, "pageNum"); } PageResult<TrainApply> a = trainApplyService.findContentResult(currentPage); addPageResultModel2(a, currentPage, model); return "common/train/admin/applyList"; }
处理分页参数
protected <E extends VO> void addPageResultModel2(PageResult<E> pct,Integer currentPage, Model model) { model.addAttribute("totalCount", pct.getTotalCount()); model.addAttribute("numPerPage", Constant.DEFAULT_PAGE_SIZE); model.addAttribute("pageNum", currentPage); model.addAttribute("pageNumShown", pct.getPageCount(pct.getTotalCount(), Constant.DEFAULT_PAGE_SIZE)); model.addAttribute("currentPage", currentPage); model.addAttribute("itemList", pct.getPageResultList()); }
3)实体类
@NamedNativeQueries ( { @NamedNativeQuery( name="ReturnTrainAppyUser", query=" select a.id as apply_id,b.id as plan_id,b.title as plan_title,(select count(c.id) from train_apply_user c where c.APPLY_ID=a.ID) as 'apply_user_num',a.company as 'apply_company' from train_apply a inner join train_plan b on b.ID=a.PLAN_ID", resultSetMapping="ReturnTrainAppyUser"), } ) @SqlResultSetMappings( { @SqlResultSetMapping ( name="ReturnTrainAppyUser", entities={}, columns= { @ColumnResult(name="apply_id"), @ColumnResult(name="plan_id"), @ColumnResult(name="plan_title"), @ColumnResult(name="apply_user_num"), @ColumnResult(name="apply_company") } ) }) @Entity @Table(name = "train_apply") public class TrainApply extends VO { private static final long serialVersionUID = -6530604520661376764L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;// ID private Long planId;//计划ID private String orgName;//单位名称 private String roomType;//客房类型 private String roomNumber;//客房数 private String invoiceType;//发票类型 private String status;//状态 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public Long getPlanId() { return planId; } public void setPlanId(Long planId) { this.planId = planId; } public String getOrgName() { return orgName; } public void setOrgName(String orgName) { this.orgName = orgName; } public String getRoomType() { return roomType; } public void setRoomType(String roomType) { this.roomType = roomType; } public String getRoomNumber() { return roomNumber; } public void setRoomNumber(String roomNumber) { this.roomNumber = roomNumber; } public String getInvoiceType() { return invoiceType; } public void setInvoiceType(String invoiceType) { this.invoiceType = invoiceType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } }
4)页面处理
<table width="100%" cellspacing="0" cellpadding="0"> <thead> <tr class="Train_Resultlist-item"> <th width="50">NO.</th> <th>培训计划</th> <th>报名人数</th> <th>操作</th> </tr> </thead> <tbody> <c:forEach var="item" items="${itemList}" varStatus="s"> <tr> <td>${s.index + 1}</td> <td>${item[2]}</td> <td>${item[3]}</td> <td> <div class="applylist_operate"> <a class="icon icon_train_edit" href="<c:url value='/train/admin/applyEdit/${item[0]}.htm'/>"></a> <a class="icon icon_train_delete" href="<c:url value='/train/admin/applyDelete'/>/${item[0]}.htm" title="确定要删除吗?删除后数据将不可恢复"></a> </div> </td> </tr> </c:forEach> <!-- 分页start --> <tr> <td colspan="4"> <div class="green-black"> 共${totalCount}条数据. <a title="首页" href="<c:url value='/train/admin/applyList.htm?pageNum=1'/>">首页</a> <c:if test="${currentPage le 1}" var="syy"> <a title="上一页" href="#">上一页</a> </c:if> <c:if test="${!syy}"> <a title="上一页" href="<c:url value='/train/admin/applyList.htm?pageNum=${currentPage-1}'/>">上一页</a> </c:if> <c:forEach var="pageNo" begin="1" end="${pageNumShown}"> <a href="<c:url value='/train/admin/applyList.htm?pageNum=${pageNo}'/>"> <c:if test="${currentPage eq pageNo}" var="rsFy"> <strong>${pageNo}</strong> </c:if> <c:if test="${!rsFy}"> ${pageNo} </c:if> </a> </c:forEach> <c:if test="${currentPage ge pageNumShown}" var="xyy"> <a title="下一页" href="#">下一页</a> </c:if> <c:if test="${!xyy}"> <a title="下一页" href="<c:url value='/train/admin/applyList.htm?pageNum=${currentPage+1}'/>">下一页</a> </c:if> <a title="尾页" href="<c:url value='/train/admin/applyList.htm?pageNum=${pageNumShown}'/>">尾页</a> </div> </td> </tr> <!-- 分页end --> </tbody> </table>
第二种createNativeQuery(返回方式为实体对象集合)
1)dao层代码
@SuppressWarnings("unchecked") public PageResult<T> getList(Integer currentPage){ int pageSize = Constant.DEFAULT_PAGE_SIZE; int start = (currentPage - 1) * pageSize; String sql="select a.* " +" from train_apply a inner join train_plan b on b.ID=a.PLAN_ID"; PageResult<T> pageResult = new PageResult<T>(); Query query = getEntityManager().createNativeQuery(sql.toString(),TrainApply.class); int total = query.getResultList().size(); // 判断分页 if (start < total && pageSize > 0) { query.setFirstResult(start); query.setMaxResults(pageSize); pageResult.setFirst(start); pageResult.setPageSize(pageSize); } pageResult.setTotalCount(total); pageResult.setPageResultList(query.getResultList()); return pageResult; }
2)其他与第一种类似,实体类不需要注释@NamedNativeQueries等。页面读取为item.planId类似方法获取数据,而不是item[0],item[1]。。。只是对于复杂的sql好像不太适合,比如说要count(id)某一列,目前用这种方式还不能实现几个表直接复杂字段展现查询。待研究。
第三种 注解对象查询(返回方式为实体对象集合)
1)dao层
@Query("select new TrainApplyVo(a.id,count(c.id) as applyUserNum,a.orgName as applyUserCompany)" +" from TrainApply a,TrainPlan b,TrainApplyUser c where b.id=a.planId and a.id=c.applyId and b.id = ?1 group by b.id") public List<TrainApply> getTrainApplyListByPlanId(Long planId);
2)这里可查询集合,但是暂时还没有方法如何去处理分页。。。
相关推荐
JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询JPA分页查询与条件分页查询...
使用SpringBoot和Spring-data-jpa进行分页查询可以大大简化编码流程并提高开发效率。 在使用Spring-data-jpa进行分页查询时,需要遵循以下步骤: 引入依赖 在pom.xml文件中加入spring-boot-starter-data-jpa依赖,...
Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。
在学习jpa时候做的一个struts2+spring+jpa整合的完整例子 包含分页,一个简单的 资产入库系统 并实现了登陆等。
Spring Data JPA中文文档1.4.3
springboot结合jpa实现分页,动态多条件查询,使用thymeleaf前端渲染数据
本篇文章主要介绍了spring data jpa分页查询示例代码,分页在很多项目中都能使用,具有一定的参考价值,有兴趣的可以了解一下。
spring data jpa 的Specifications动态查询 单条件查询 多条件查询 分页查询
spring注解完整版+spring data jpa官方文档中文翻译+JPA2.0官方文档 文档内容齐全 值得参考学习
Spring,Spring Data Jpa,freemarker,bootstrap实现的分页源代码
maven+springmvc+springjpa+hibernate简单例子,有需要的朋友可以参考看看,没费的哦。
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
'SpringDataJPA从入门到精通'分为12章 内容包括整体认识JPA、JPA基础查询方法、定义查询方法、注解式查询方法、@Entity实例里面常用注解详解、JpaRepository扩展详解、JPA的MVC扩展REST支持、DataSource的配置、乐观...
spring+springMVC+spring-data-jpa+freemarket/json
#boot-jpa-security-dmdb-freemark spring boot spring security 达梦数据库 ftl assembly 打包
spring mvc spring jpa集成 mysql
springdatajpa 包括jar包 结合struts2 spring 和springdatajpa 注解
Spring JPA 配置类包集合 方便大家使用
第一章:Spring Data JPA入门 包括:是什么、能干什么、有什么、HelloWorld等 第二章:JpaRepository基本功能 包括:代码示例JpaRepository提供的CRUD功能,还有翻页、排序等功能 第三章:JpaRepository的查询 ...
网站开发运用jar包,spring框架下jpa数据库操作使用整理打包