欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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 Data Jpa