我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现。

如果是查询条件是动态的,框架也提供了查询接口。
JpaSpecificationExecutor
和其他接口使用方式一样,只需要在你的Dao接口继承即可(官网代码)。
public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor {
…
}
JpaSpecificationExecutor提供很多条件查询方法。
public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);
List<T> findAll(Specification<T> var1);
Page<T> findAll(Specification<T> var1, Pageable var2);
List<T> findAll(Specification<T> var1, Sort var2);
long count(Specification<T> var1);
}
比如方法:
List<T> findAll(Specification<T> var1);
就可以查找出符合条件的所有数据,如果你的框架使用的是前段分页的技术,那么这个方法就挺简便的。
那么这个方法该如何使用呢?我们看到它需要的参数是一个
org.springframework.data.jpa.domain.Specification
对象。那我们就创建这个对象先看看。
Specification specification = new Specification() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
return null;
}
}
IDE自动生成了要重写的方法toPredicate。
root参数是我们用来对应实体的信息的。criteriaBuilder可以帮助我们制作查询信息。
/**
* A root type in the from clause.
* Query roots always reference entities.
*
* @param <X> the entity type referenced by the root
* @since Java Persistence 2.0
*/
public interface Root<X> extends From<X, X> {...}
/**
* Used to construct criteria queries, compound selections,
* expressions, predicates, orderings.
*
* <p> Note that <code>Predicate</code> is used instead of <code>Expression<Boolean></code>
* in this API in order to work around the fact that Java
* generics are not compatible with varags.
*
* @since Java Persistence 2.0
*/
public interface CriteriaBuilder {...}
CriteriaBuilder对象里有很多条件方法,比如制定条件:某条数据的创建日期小于今天。
criteriaBuilder.lessThan(root.get("createDate"), today)
该方法返回的对象类型是Predicate。正是toPredicate需要返回的值。
如果有多个条件,我们就可以创建一个Predicate集合,最后用CriteriaBuilder的and和or方法进行组合,得到最后的Predicate对象。
/** * Create a conjunction of the given restriction predicates. * A conjunction of zero predicates is true. * * @param restrictions zero or more restriction predicates * * @return and predicate */ Predicate and(Predicate... restrictions);
/** * Create a disjunction of the given restriction predicates. * A disjunction of zero predicates is false. * * @param restrictions zero or more restriction predicates * * @return or predicate */ Predicate or(Predicate... restrictions);
示例:
public List<WeChatGzUserInfoEntity> findByCondition(Date minDate, Date maxDate, String nickname){
List<WeChatGzUserInfoEntity> resultList = null;
Specification querySpecifi = new Specification<WeChatGzUserInfoEntity>() {
@Override
public Predicate toPredicate(Root<WeChatGzUserInfoEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates = new ArrayList<>();
if(null != minDate){
predicates.add(criteriaBuilder.greaterThan(root.get("subscribeTime"), minDate));
}
if(null != maxDate){
predicates.add(criteriaBuilder.lessThan(root.get("subscribeTime"), maxDate));
}
if(null != nickname){
predicates.add(criteriaBuilder.like(root.get("nickname"), "%"+nickname+"%"));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
resultList = this.weChatGzUserInfoRepository.findAll(querySpecifi);
return resultList;
}
and到一起的话所有条件就是且关系,or就是或关系了。
其实也是在Stack Overflow上看到的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Spring
# Data
# JPA动态条件查询
# JPA动态查询
# JPA原生SQL(自定义SQL)分页查询逻辑详解
# JPA多条件复杂SQL动态分页查询功能
# JPA框架实现分页查询和条件查询功能详解
# 就可以
# 的是
# 是一个
# 是在
# 多个
# 有很多
# 只需
# 要在
# 分页
# 自定义
# 重写
# 可以使用
# 该如何
# 可以帮助
# 创建一个
# 符合条件
# 自动生成
# 官网
# 大家多多
# 创建日期
相关文章:
惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?
定制建站哪家更专业可靠?推荐榜单揭晓
如何快速完成中国万网建站详细流程?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
宝塔建站助手安装配置与建站模板使用全流程解析
制作证书网站有哪些,全国城建培训中心证书查询官网?
如何制作算命网站,怎么注册算命网站?
如何快速上传建站程序避免常见错误?
浅谈Javascript中的Label语句
如何在阿里云ECS服务器部署织梦CMS网站?
如何自定义建站之星网站的导航菜单样式?
如何在服务器上三步完成建站并提升流量?
如何设置并定期更换建站之星安全管理员密码?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
高防服务器租用如何选择配置与防御等级?
如何通过服务器快速搭建网站?完整步骤解析
网站制作公司,橙子建站是合法的吗?
如何获取开源自助建站系统免费下载链接?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
建站之星ASP如何实现CMS高效搭建与安全管理?
开源网站制作软件,开源网站什么意思?
如何通过FTP空间快速搭建安全高效网站?
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
再谈Python中的字符串与字符编码(推荐)
如何在IIS中新建站点并配置端口与IP地址?
黑客如何通过漏洞一步步攻陷网站服务器?
seo网站制作优化,网站SEO优化步骤有哪些?
c# 在高并发下使用反射发射(Reflection.Emit)的性能
小建面朝正北,A点实际方位是否存在偏差?
如何通过cPanel快速搭建网站?
香港服务器建站指南:免备案优势与SEO优化技巧全解析
建站之星后台密码遗忘如何找回?
如何快速搭建高效WAP手机网站吸引移动用户?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
外贸公司网站制作哪家好,maersk船公司官网?
如何快速搭建安全的FTP站点?
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
广东企业建站网站优化与SEO营销核心策略指南
如何通过FTP服务器快速搭建网站?
如何续费美橙建站之星域名及服务?
,如何利用word制作宣传手册?
公司门户网站制作流程,华为官网怎么做?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
网站制作费用多少钱,一个网站的运营,需要哪些费用?
北京制作网站的公司,北京铁路集团官方网站?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?
全景视频制作网站有哪些,全景图怎么做成网页?
如何快速生成橙子建站落地页链接?
*请认真填写需求信息,我们会在24小时内与您取得联系。