您的位置:首页 > 编程语言 > ASP

Spring Data Jpa >>JpaSpecificationExecutor 查询语句

2018-03-20 14:47 621 查看
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(
4000
"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();
}

}
);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: