春数据jpa的使用方法?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
(1)什么是规范
规范是springDateJpa中的一个接口,他是用于当jpa的一些基本CRUD操作的扩展,可以把他理解成一个春天jpa的复杂查询接口。其次我们需要了解标准查询,这是是一种类型安全和更面向对象的查询。而春天数据jpa支持JPA2.0的标准查询,相应的接口是JpaSpecificationExecutor。
而JpaSpecificationExecutor这个接口基本是围绕着规范接口来定义的,规范接口中只定义了如下一个方法:
谓词toPredicate (Root根,CriteriaQuery<及# 63;比;查询,querybuilder cb);
<强>标准查询基本概念:强>
标准查询是以元模型的概念为基础的,元模型是为具体持久化单元的受管实体定义的,这些实体可以是实体类,嵌入类或者映射的父类。
<强> CriteriaQuery接口:强>
代表一个特定的顶层查询对象,它包含着查询的各个部分,比如:选择,,,组,按等注意:CriteriaQuery对象只对实体类型或嵌入式类型的标准查询起作用。
<强>根:强>
代表标准查询的根对象,标准查询的查询根定义了实体类型,能为将来导航获得想要的结果,它与SQL查询中从子的句类似。
根实例是类型化的,且定义了查询的从子句中能够出现的类型.root代表查询的实体类,查询可以从中得到根对象,告诉jpa查询哪一个实体类,还可以添加查询条件,还可以结合EntityManager对象得到最终查询的TypedQuery对象。
<强> querybuilder接口:强>
用来构建CritiaQuery的构建器对象谓词:一个简单或复杂的谓词类型,其实就相当于条件或者是条件组合。可通过EntityManager。getCriteriaBuilder而得。
maven的依赖继续使用上一章的就可以,这里修改一下实体类和控制器层。
请求实体类:
@ data 公开课AccountRequest {//从第几页开始 私人整数页面;//每一页查询多少 私人整数限制; 私人字符串id; 私人字符串名称; 私人字符串pwd; 私人字符串邮件; 私人整数[]类型; }
实体类:
@ data @ entity @ table (name=癮ccount") @ToString @EntityListeners (AuditingEntityListener.class) 公共类账户{ @ id @GenericGenerator (name=癷dGenerator"策略=皍uid") @GeneratedValue(发电机=癷dGenerator") 私人字符串id; @ column (name=皍sername"独特=true, nullable=false,长度=64) 私人字符串的用户名; @ column (name=皃assword" nullable=false,长度=64) 私人密码字符串; @ column (name=癳mail"长度=64) 私人字符串邮件; @ column (name=皌ype") 私人短类型; @CreatedDate @ column (name=癱reate_time" nullable=false) 私人LocalDateTime createTime; }
库层:
公共接口AccountRepository延伸JpaRepository<帐户,String>, JpaSpecificationExecutor{}
控制器层(还是直接略过服务层)
@ autowired 私人AccountRepository库; @PostMapping (“/get") 公共Listget (@RequestBody AccountRequest请求){ Specification 规范=new Specification () { @Override 公共谓词toPredicate (Root 根,CriteriaQuery<及# 63;比;criteriaQuery querybuilder builder) {//所有的断言及条件 List 谓词=new ArrayList<在();//精确匹配id pwd 如果(request.getId () !=null) { predicates.add (builder.equal (root.get (“id") request.getId ())); } 如果(request.getPwd () !=null) { predicates.add (builder.equal (root.get (“password") request.getPwd ())); }//模糊搜索的名字 如果(request.getName() !=零,,.equals ! request.getName () (“;”)) { predicates.add (builder.like (root.get (“username"),“%”;+ request.getName () +“%”); } 如果(request.getEmail() !=零,,.equals ! request.getEmail () (“;”)) { predicates.add (builder.like (root.get (“email"),“%”;+ request.getEmail () +“%”); }//在范围查询 如果(request.getTypes () !=null) { CriteriaBuilder.In