Spring Data Jpa >>JpaSpecificationExecutor 查询语句
程序员文章站
2022-04-28 16:41:34
...
Repository 必须继承
@Repository
public interface GeReRepository extends JpaRepository<Ge,Long>, JpaSpecificationExecutor<Ge> {
}
1.两张表 一对一关系 进行查询
@Query("select bu from Ge bu where bu.itemName=(?1) and bu.billData=(?2) and bu.billLineItem.productName =(?3)")
List<Ge> findByItemNameAndBillDataAndVmId(String itemName,BillData billData,String productName);
2.如果查询的字段为Null
@Query("select bu from Ge bu where bu.itemName=(?1) and bu.billData=(?2) and bu.billLineItem.productName is null")
List<Ge> findByItemNameAndBillDataAndVmId(String itemName,BillData billData);
我的理解是当需要把字段为空设置成过滤字段时 就需要重载。
3.使用SpecificationExecutor 实现多表查询(GeReRepository实现了SpecificationExecutor接口)
List<Ge> result = billUsageReRepository.findAll(new Specification<Ge>() {
@Override
public Predicate toPredicate(Root<Ge> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
// TODO Auto-generated method stub
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("itemName").as(String.class), "S"));
//list.add(cb.equal(root.get("billLineItem.productName").as(String.class), "V"));
list.add(cb.equal(root.get("billLineItem").get("productName").as(String.class), "V"));
Predicate[] p = new Predicate[list.size()];
query.where(cb.and(list.toArray(p)));
return query.getRestriction();
}
}
);
类似于1的sql语句
root.get("billLineItem").get("productName") 相当于构建路径
root.get("billLineItem.productName")这样是错的
4.使用SpecificationExecutor 实现复杂查询,查询值为null
查询productName字段为null 的值
List<Ge> result = billUsageReRepository.findAll(new Specification<Ge>() {
@Override
public Predicate toPredicate(Root<Ge> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
// TODO Auto-generated method stub
List<Predicate> list = new ArrayList<Predicate>();
list.add(cb.equal(root.get("itemName").as(String.class), "SMS1"));
//list.add(cb.equal(root.get("billLineItem.productName").as(String.class), "V"));
// list.add(cb.equal(root.get("billLineItem").get("productName").as(String.class),"V"));
list.add(cb.isNull(root.get("billLineItem").get("productName").as(String.class)));
Predicate[] p = new Predicate[list.size()];
query.where(cb.and(list.toArray(p)));
return query.getRestriction();
}
}
);
推荐阅读
-
在Spring Boot中使用Spring-data-jpa实现分页查询
-
序列化表单为json对象,datagrid带额外参提交一次查询 后台用Spring data JPA 实现带条件的分页查询 多表关联查询
-
spring data jpa碰到的坑
-
使用Spring Data JPA进行数据分页与排序
-
spring-data-jpa实现增删改查以及分页操作方法
-
详解Spring Data JPA使用@Query注解(Using @Query)
-
Spring Data JPA使用Sort进行排序(Using Sort)
-
详解Spring Data JPA系列之投影(Projection)的用法
-
spring data jpa使用详解(推荐)
-
javaweb各种框架组合案例(六):springboot+spring data jpa(hibernate)+restful