最近项目上用就hibernate+spring data jpa,一开始感觉还不错,但是随着对业务的复杂,要求处理一些复杂的sql,就顺便研究了下,把结果记录下,以便日后查看。用到Specification,需要继承JpaSpecificationExecutor接口。(下面代码有的分页从0开始作为第一页,有的从1开始作为作为第一页,我也忘记,请自己测试)

DAO层:
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface CameraInfoRepo extends JpaRepository<CameraInfoPO, String>, JpaSpecificationExecutor<CameraInfoPO> {
@Query("select c from CameraInfoPO c where c.deviceInfo.id = ?1")
public List<CameraInfoPO> findCamerasByDeviceId(String listDeviceInfoId);
//更新之后不清空缓存,在一个事务里查询到旧数据(hibernate)
@Modifying
@Query(value = "update CameraInfoPO c set c.isEnabled = 1 where c.id = ?1")
public void updateEnabled(String cameraId);
//更新之后清空缓存,不保留旧对象(hibernate)
@Modifying(clearAutomatically = true)
@Query(value = "update CameraInfoPO c set c.isEnabled = 0 where c.id = ?1")
public void updateUnEnabled(String cameraId);
//带条件的分页查询
public Page<CameraInfoPO> findByIsEnabled(Integer isEnabled, Pageable pageable);
}
DAO实现层
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Repository;
@Repository
public class CameraInfoRepoImpl {
@PersistenceContext
private EntityManager em;
@Resource
private CameraInfoRepo cameraInfoRepo;
public Page<CameraInfoPO> findCameraInfoByPage(Pageable pageable, Integer isEnabled) {
//CriteriaBuilder,用来构建CritiaQuery的构建器对象
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
//CriteriaQuery,它包含着查询语句的条件各个部分,比如:select 、from、where、group by、order by等
CriteriaQuery<CameraInfoPO> criteriaQuery = criteriaBuilder.createQuery(CameraInfoPO.class);
//查询根,用于获取查询实例的属性,通过CriteriaQuery的from方法获取
Root<CameraInfoPO> rootFrom = criteriaQuery.from(CameraInfoPO.class);
//查询条件
List<Predicate> predicates = new ArrayList<Predicate>();
if (null != isEnabled) {
Predicate predicate = criteriaBuilder.equal(rootFrom.get("isEnabled").as(Integer.class), isEnabled);
predicates.add(predicate);
}
//格式化参数
criteriaQuery.where(criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()])));
//默认按照id排序(从小到大)
criteriaQuery.orderBy(criteriaBuilder.asc(rootFrom.get("id")));
//SQL查询对象
TypedQuery<CameraInfoPO> createQuery = em.createQuery(criteriaQuery);
//分页参数
Integer pageSize = pageable.getPageSize();
Integer pageNo = pageable.getPageNumber();
//计数查询结果条数
TypedQuery<CameraInfoPO> createCountQuery = em.createQuery(criteriaQuery);
// 实际查询返回分页对象
int startIndex = pageSize * pageNo;
createQuery.setFirstResult(startIndex);
createQuery.setMaxResults(pageable.getPageSize());
Page<CameraInfoPO> pageRst =
new PageImpl<CameraInfoPO>(createQuery.getResultList(), pageable, createCountQuery.getResultList().size());
return pageRst;
}
//制造查询条件结果(建议存放map)
private Specification<CameraInfoPO> getWhereClause(final Integer isEnabled) {
return new Specification<CameraInfoPO>() {
public Predicate toPredicate(Root<CameraInfoPO> r, CriteriaQuery<?> q, CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
if (null != isEnabled) {
predicate = cb.equal(r.get("isEnabled").as(Integer.class), isEnabled);
}
return predicate;
}
};
}
//单表根据查询条件的分页
public Page<CameraInfoPO> findCameraInfoByPageForJpa(Pageable pageable, Integer isEnabled) {
Specification<CameraInfoPO> spec = getWhereClause(isEnabled);
Page<CameraInfoPO> pageRst = cameraInfoRepo.findAll(spec, pageable);
return pageRst;
}
}
还有另外一种就更简单了,如果只是根据表里面的一个或者几个字段,可以直接写jpa实现,不用复杂
Pageable pageable = new PageRequest(1, 1); Page<CameraInfoPO> page = cameraInfoRepo.findByIsEnabled(1, pageable);
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# data
# jpa
# 分页
# 分页查询
# Spring Data JPA分页复合查询原理解析
# Spring Data JPA进行数据分页与排序的方法
# spring-data-jpa实现增删改查以及分页操作方法
# Spring MVC结合Spring Data JPA实现按条件查询和分页
# 在Spring Boot中使用Spring-data-jpa实现分页查询
# Spring Data JPA 复杂/多条件组合分页查询
# Spring Data JPA带条件分页查询实现原理
# 第一页
# 清空
# 我也
# 几个
# 可以直接
# 还不错
# 就更
# 查询结果
# 含着
# 从小到大
# 大家多多
# 条数
# 日后
# interface
# deviceInfo
# id
# public
# select
# extends
相关文章:
如何快速搭建高效WAP手机网站吸引移动用户?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
如何基于云服务器快速搭建个人网站?
建站主机是否等同于虚拟主机?
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何用景安虚拟主机手机版绑定域名建站?
赚钱网站制作软件,建一个网站怎样才能赚钱?是如何盈利的?
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
利用JavaScript实现拖拽改变元素大小
建站之星在线客服如何快速接入解答?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
如何将凡科建站内容保存为本地文件?
,石家庄四十八中学官网?
如何通过VPS建站实现广告与增值服务盈利?
如何快速搭建高效可靠的建站解决方案?
广州建站公司哪家好?十大优质服务商推荐
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
PHP 500报错的快速解决方法
早安海报制作网站推荐大全,企业早安海报怎么每天更换?
Swift开发中switch语句值绑定模式
深入理解Android中的xmlns:tools属性
C#怎么使用委托和事件 C# delegate与event编程方法
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
如何选择域名并搭建高效网站?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
如何获取上海专业网站定制建站电话?
微信h5制作网站有哪些,免费微信H5页面制作工具?
北京专业网站制作设计师招聘,北京白云观官方网站?
建站之星与建站宝盒如何选择最佳方案?
建站主机选购指南:核心配置优化与品牌推荐方案
制作企业网站建设方案,怎样建设一个公司网站?
香港服务器租用费用高吗?如何避免常见误区?
如何在腾讯云服务器快速搭建个人网站?
如何在宝塔面板中修改默认建站目录?
微信推文制作网站有哪些,怎么做微信推文,急?
定制建站如何定义?其核心优势是什么?
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何通过云梦建站系统实现SEO快速优化?
如何通过wdcp面板快速创建网站?
制作网站公司那家好,网络公司是做什么的?
建站之星代理商如何保障技术支持与售后服务?
北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?
制作销售网站教学视频,销售网站有哪些?
网站企业制作流程,用什么语言做企业网站比较好?
如何在IIS中新建站点并解决端口绑定冲突?
建站org新手必看:2024最新搭建流程与模板选择技巧
公司网站的制作公司,企业网站制作基本流程有哪些?
*请认真填写需求信息,我们会在24小时内与您取得联系。