`

Spring JPA 查询的几种方式并处理分页

    博客分类:
  • @SSH
阅读更多

第一种 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)这里可查询集合,但是暂时还没有方法如何去处理分页。。。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics