JPA Specification常用查询+排序实例

网友投稿 331 2022-09-14


JPA Specification常用查询+排序实例

目录JPA Specification常用查询+排序1.第一步:继承父类2.第二步JPA Specification复杂查询+排序需求开始了1.dao2.service3.排序前端结束语

JPA Specification常用查询+排序

1.第一步:继承父类

public interface TblCarton2RCardLogRepository extends JpaRepository,JpaSpecificationExecutor {

2.第二步

tblCarton2RCardLogRepository.findAll(new Specification() {

@Override

public Predicate toPredicate(Root rootgNUirquMPs, CriteriaQuery> query,CriteriaBuilder cb) {

List list = new ArrayList();

list.add(cb.equal(root.get("cartonNo").as(String.class), cartonNo));//某普通字段

list.add(cb.equal(root.get("id").get("rCard").as(String.class), rCard));//主键中某字段

list.add(cb.like(root.get("mocode").as(String.class), "%" + mocode + "%"));//like

list.add(cb.between(root.get("frozenDate").as(gNUirquMPsLong.class), frozenDateStart, frozenDateEnd));//between and

list.add(cb.greaterThanOrEqualTo(root.get("id").get("rcard").as(String.class), rCardStart));//大于等于

list.add(root.get("id").get("lotNo").as(String.class).in(lotNos));//in

//ORDER BY packdate DESC,packtime DESC

Predicate[] p = new Predicate[list.size()];

query.where(cb.and(list.toArray(p)));

query.orderBy(cb.desc(root.get("packDate")),cb.desc(root.get("packTime")));

return query.getRestriction();

}

});

JPA Specification复杂查询+排序

刚使用spring-data-jpa,遇到不少难题,网上查了很多资料,发现讲jpa的不多,发个我刚做过的接口的过程吧。

需求

看到图了吗?需要实现搜索以及各种字段的排序还要分页,还有可能有选择各种条件的下拉列表,是不是很变态?

开始了

1.dao

需要先处理dao层,这里喜欢叫repository。做一个实体类的dao层接口,继承JpaSpecificationExecutor,再写一个查询接口。

2.service

在这里主要处理的是查询条件,我这里是搜索功能的模糊查询,当然如果有更多的查询也可以添加进这里。这里需要注意的是specification。

3.排序

需要先建一个辅助的实体类,属性名我取和需要排序的实体类一样的名字,但是注意属性都是String类型的啊。后面细说,先上我建的辅助类。

@Data

public class DeptSort {

private String id;//编码

private String name;//名称

private String highDeptName;//上级部门

private String principal;//负责人

private String deptType;//部门类型

private String enable;//启用

}

字段都是需要排序的字段,这是为了好区分,叫别的也可以。

下面是controller层,排序功能的具体实现。

public ResponseModel table(@RequestParam("search")String search,

@RequestParam("pageNumber")Integer pageNumber,

@RequestParam("pageSize")Integer pageSize,

@RequestBody DeptSort deptSort){

ResponseModel model = null;

try {

List orders = new ArrayList();

if (StringUtils.isNotBlank(deptSort.getId())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getId()),"id"));

}

if (StringUtils.isNotBlank(deptSort.getName())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getName()),"name"));

}

if (StringUtils.isNotBlank(deptSort.getHighDeptName())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getHighDeptName()),"highDeptName"));

}

if (StringUtils.isNotBlank(deptSort.getPrincipal())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getPrincipal()),"principal"));

}

if (StringUtils.isNotBlank(deptSort.getDeptType())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getDeptType()),"deptType"));

}

if (StringUtils.isNotBlank(deptSort.getEnable())){

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"));

}

//orders不能为空,所以如果为空设置按id排序[/code][code] if (orders.size() == 0){

orders.add(new Sort.Order(Sort.Direction.ASC,"id"));

}

Sort sort = new Sort(orders);

Pageable pageable = new PageRequest(pageNumber,pageSize,sort);

Page all = service.findAll(search, pageable);

model = ResponseModel.getSuccessResponseModel().setData(all);

}catch (Exception e){

e.printStackTrace();

model = ResponseModel.getFailedResponseModel();

}

return model;

}

需要的参数有搜索内容search,还有DeptSort辅助类。首先建立

List orders = new ArrayList();

集合,然后if判断将参数加入集合。

需要说明的是类似

orders.add(new Sort.Order(Sort.Direction.fromString(deptSort.getEnable()),"enable"))

语句,“enable”是需要查询的Businessdept里的字段,不是辅助类的,当然这里我的辅助类和Businessdept类一致,但是不一样的同学需要注意了。

前端

对于前端传递的参数有什么要求呢?

deptSort的各个属性的参数只能限定两种asc和desc,即升序和降序。上图的功能需求只需要传deptSort里的一个属性就可以了,这里传两个参数演示一下。

查询成功的数据不展示了,给大家看一个后台的SQL语句

Hibernate:

/* select

count(generatedAlias0)

from

Businessdept as generatedAlias0

where

(

generatedAlias0.name like :param0

)

and (

generatedAlias0.deleteIs=1

) */ select

count(businessde0_.id) as col_0_0_

from

t_department businessde0_

where

(

businessde0_.name like ?

)

and businessde0_.delete_is=1

Hibernate:

/* select

generatedAlias0

from

Businessdept as generatedAlias0

where

(

generatedAlias0.name like :param0

)

and (

generatedAlias0.deleteIs=1

)

order by

generatedAlias0.deptType asc,

generatedAlias0.enable desc */ select

businessde0_.id as id1_3_,

businessde0_.delete_is as delete_i2_3_,

businessde0_.dept_type as dept_typ3_3_,

businessde0_.enable as enable4_3_,

businessde0_.high_dept_id as high_dep5_3_,

businessde0_.high_dept_name as high_dep6_3_,

businessde0_.name as name7_3_,

businessde0_.principal as principa8_3_

from

t_department businessde0_

where

(

businessde0_.name like ?

)

and businessde0_.delete_is=1

order by

businessde0_.dept_type asc,

businessde0_.enable desc limit ?

可以看到条件查询,升序、降序都有。

结束语


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SNMP(简单网络管理协议)技术(snmp协议是唯一的主流网络管理协议)
下一篇:aix 网络管理命令(爱寻迷)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~