第一种 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)这里可查询集合,但是暂时还没有方法如何去处理分页。。。
相关推荐
在Spring Boot应用中,使用Spring Data JPA进行分页查询是一种高效且简洁的方式。Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库...
它提供了一种面向对象的方式来操作数据库,使得开发人员能够用Java对象来表示数据库中的表和记录。 Spring Data JPA则是在JPA之上构建的一层抽象,它扩展了JPA的功能,提供了更多的便利。例如,Spring Data JPA支持...
JPA提供了一种标准的方式来管理对象-关系映射(ORM),使得开发者无需直接编写SQL即可操作数据库。 **Hibernate JPA核心概念:** 1. **实体(Entity)**:对应数据库表的Java类,通过@Entity注解标识。 2. **实体...
总结来说,Spring Data JPA 为开发者提供了简单而强大的 API 来处理数据库操作,它不仅极大地减少了模板代码的数量,还允许开发者轻松地实现复杂的查询逻辑。对于想要提高生产力并减少样板代码的 Java 开发者来说,...
Querydsl提供了一种类型安全的方式来构建动态查询,而Specifications则是基于JPA的查询API,允许在运行时构造查询条件。 7. **Auditing**:Spring Data JPA可以通过`@CreatedBy`, `@LastModifiedDate`, `@Last...
Spring Data JPA非常适合以下几种情况: - 当需要快速搭建数据访问层时。 - 当项目的数据库操作需求相对简单,主要是CRUD操作。 - 当希望减少样板代码的数量,提高开发效率。 - 当团队成员需要快速掌握数据库访问...
Spring Data JPA 提供了一种声明式的方式来处理数据库交互,允许开发者以更简洁的方式实现数据访问层。通过使用 Spring Data JPA,你可以快速开发出与数据库交互的仓库接口,而无需编写大量的 CRUD(创建、读取、...
`Specification`是Spring Data JPA提供的一种强大工具,用于构建动态、复杂的查询条件,尤其适用于处理复杂的业务场景中的查询需求。在这里,我们深入探讨`Specification`的使用及其在实际开发中的价值。 首先,`...
Spring Data JPA支持分页查询、排序、关联查询等功能。同时,通过调整JPA配置,如缓存策略、批处理等,可以进一步优化性能。 9. 总结: Spring Boot整合Spring Data JPA大大简化了数据库访问的复杂度,提高了开发...
在Java开发中,分页是常见的数据处理方式,特别是在大数据量的展示场景下,它可以有效减少内存负担,提高用户体验。本篇文章将详细讲解在Oracle数据库环境下,Java实现分页的三种方法。 一、JDBC手动分页 1. **...
Hibernate支持两种分页方式:Criteria API和HQL(Hibernate Query Language)。Criteria API可以通过DetachedCriteria对象创建查询条件,然后调用setFirstResult和setMaxResults方法实现分页。HQL则通过LIMIT子句...
首先,Spring Data JPA 提供了一种基于方法名的自动查询映射机制。例如,`findByUsernameAndPassword(String user, String pwd)` 这个方法会自动翻译成SQL查询,寻找用户名和密码匹配的记录。同样,`...
Spring Boot简化了Spring应用的初始设置和配置,而JPA作为Java平台上的ORM(对象关系映射)标准,使得开发者能够使用面向对象的方式来操作数据库,无需过多关注底层SQL语句。 **1. Spring Boot基础** Spring Boot是...
JPA提供了多种方式进行多表查询,主要包括以下几种: 1. **JOIN查询**:在JPA中,你可以使用`@ManyToOne`, `@OneToOne`, `@OneToMany`, `@ManyToMany`等注解来定义实体之间的关系。然后通过`@JoinTable`或`@...
5. **分页库的使用**:在实际开发中,我们通常会使用一些成熟的Java分页库,如MyBatis的PageHelper或Spring Data JPA的Pageable接口,它们能简化分页逻辑,提供更友好的API。 6. **性能优化**:在处理大数据量时,...
Spring MVC 提供了多种方法来实现分页,包括但不限于以下几种: 1. **使用Spring Data JPA的Pageable接口**: Spring Data JPA 是Spring的一个模块,它简化了JPA(Java Persistence API)的使用。通过Repository...
在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. **...
4. **Spring Data JPA分页**:如果你使用Spring框架,Spring Data JPA提供了一种更高级的分页支持。通过Pageable接口,可以轻松地实现分页查询,并自动计算总页数。 5. **MyBatis分页插件**:对于MyBatis框架,有像...