`

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

分享到:
评论

相关推荐

    SpringBoot中使用Spring-data-jpa分页查询

    在Spring Boot应用中,使用Spring Data JPA进行分页查询是一种高效且简洁的方式。Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库...

    Spring Data JPA 笔记

    它提供了一种面向对象的方式来操作数据库,使得开发人员能够用Java对象来表示数据库中的表和记录。 Spring Data JPA则是在JPA之上构建的一层抽象,它扩展了JPA的功能,提供了更多的便利。例如,Spring Data JPA支持...

    SpringMVC +Hibernate JPA+Spring-data-jpa实例

    JPA提供了一种标准的方式来管理对象-关系映射(ORM),使得开发者无需直接编写SQL即可操作数据库。 **Hibernate JPA核心概念:** 1. **实体(Entity)**:对应数据库表的Java类,通过@Entity注解标识。 2. **实体...

    spring data jpa参考文档

    总结来说,Spring Data JPA 为开发者提供了简单而强大的 API 来处理数据库操作,它不仅极大地减少了模板代码的数量,还允许开发者轻松地实现复杂的查询逻辑。对于想要提高生产力并减少样板代码的 Java 开发者来说,...

    SpringDataJpa.rar

    Querydsl提供了一种类型安全的方式来构建动态查询,而Specifications则是基于JPA的查询API,允许在运行时构造查询条件。 7. **Auditing**:Spring Data JPA可以通过`@CreatedBy`, `@LastModifiedDate`, `@Last...

    spring data jpa百度网盘视频下载地址.md

    Spring Data JPA非常适合以下几种情况: - 当需要快速搭建数据访问层时。 - 当项目的数据库操作需求相对简单,主要是CRUD操作。 - 当希望减少样板代码的数量,提高开发效率。 - 当团队成员需要快速掌握数据库访问...

    Spring-data-jpa示例源码

    Spring Data JPA 提供了一种声明式的方式来处理数据库交互,允许开发者以更简洁的方式实现数据访问层。通过使用 Spring Data JPA,你可以快速开发出与数据库交互的仓库接口,而无需编写大量的 CRUD(创建、读取、...

    spring.jpa.data Specification使用

    `Specification`是Spring Data JPA提供的一种强大工具,用于构建动态、复杂的查询条件,尤其适用于处理复杂的业务场景中的查询需求。在这里,我们深入探讨`Specification`的使用及其在实际开发中的价值。 首先,`...

    spring-boot-06-data-jpa.zip

    Spring Data JPA支持分页查询、排序、关联查询等功能。同时,通过调整JPA配置,如缓存策略、批处理等,可以进一步优化性能。 9. 总结: Spring Boot整合Spring Data JPA大大简化了数据库访问的复杂度,提高了开发...

    java分页 的3种方法

    在Java开发中,分页是常见的数据处理方式,特别是在大数据量的展示场景下,它可以有效减少内存负担,提高用户体验。本篇文章将详细讲解在Oracle数据库环境下,Java实现分页的三种方法。 一、JDBC手动分页 1. **...

    struts2+spring+hibernate分页查询

    Hibernate支持两种分页方式:Criteria API和HQL(Hibernate Query Language)。Criteria API可以通过DetachedCriteria对象创建查询条件,然后调用setFirstResult和setMaxResults方法实现分页。HQL则通过LIMIT子句...

    spring-data-JPA学习笔记

    首先,Spring Data JPA 提供了一种基于方法名的自动查询映射机制。例如,`findByUsernameAndPassword(String user, String pwd)` 这个方法会自动翻译成SQL查询,寻找用户名和密码匹配的记录。同样,`...

    springboot微服务项目加jpa

    Spring Boot简化了Spring应用的初始设置和配置,而JPA作为Java平台上的ORM(对象关系映射)标准,使得开发者能够使用面向对象的方式来操作数据库,无需过多关注底层SQL语句。 **1. Spring Boot基础** Spring Boot是...

    jpa工作中,多表查询的使用方式-----curd的Demo ,基本掌握后,jpa 就不是问题了

    JPA提供了多种方式进行多表查询,主要包括以下几种: 1. **JOIN查询**:在JPA中,你可以使用`@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`等注解来定义实体之间的关系。然后通过`@JoinTable`或`@...

    查询的数据分页 JAVAWEB

    5. **分页库的使用**:在实际开发中,我们通常会使用一些成熟的Java分页库,如MyBatis的PageHelper或Spring Data JPA的Pageable接口,它们能简化分页逻辑,提供更友好的API。 6. **性能优化**:在处理大数据量时,...

    springmvc_分页

    Spring MVC 提供了多种方法来实现分页,包括但不限于以下几种: 1. **使用Spring Data JPA的Pageable接口**: Spring Data JPA 是Spring的一个模块,它简化了JPA(Java Persistence API)的使用。通过Repository...

    JSP几种标签分页及相关说明

    在JSP中,我们通常使用以下几种方式来实现分页: 1. **自定义标签库(Tag Libraries)**:例如,我们可以创建一个自定义的分页标签库,包含开始、结束、上一页、下一页等标签。这些标签可以根据传递的参数(如当前...

    各种实现分页技术

    5. **Spring Data JPA**:在Spring生态中,Spring Data JPA提供了一种声明式分页,通过Pageable接口和Page类,可以在查询时指定页码和大小,返回包含总页数、总条数和数据的Page对象。 6. **Spring Boot中的...

    分页代码 重分页代码

    2. **Spring分页**:Spring提供了多种分页方式,如使用Pageable接口,配合Page和Slice对象,或者使用Spring Data JPA的PageableRepository。这些方法可以与Hibernate集成,通过查询时添加限制条件实现分页。 3. **...

    java实现的一个分页程序

    4. **Spring Data JPA分页**:如果你使用Spring框架,Spring Data JPA提供了一种更高级的分页支持。通过Pageable接口,可以轻松地实现分页查询,并自动计算总页数。 5. **MyBatis分页插件**:对于MyBatis框架,有像...

Global site tag (gtag.js) - Google Analytics