常用查询:equal(等于),notEqual(不等于), gt(大于), ge(大于等于),lt(小于), le(小于等于),between(闭区间中的值),like(模糊)等
predicates.add(cb.or(cb.like(root.get("productName"),"%" + name + "%"),cb.like(root.get("productBarcode"),"%" + name + "%")));
QBC查询
//查询模板配置记录
Specification querySpecifi = new Specification<ConfigImage>() {@Overridepublic Predicate toPredicate(Root<ConfigImage> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {List<Predicate> predicates = new ArrayList<>();predicates.add(cb.equal(root.get("enabledFlag"), 1));predicates.add(cb.equal(root.get("imageType"), 2));//2功能图标predicates.add(cb.equal(root.get("appid"), "wx3a99cda67d10d479"));return cb.and(predicates.toArray(new Predicate[predicates.size()]));}
};
List<ConfigImage> list = configImageRepo.findAll(querySpecifi);
CriteriaBuilder子查询 CriteriaBuilder之in及not in
子查询模式
//子查询
Subquery<WorkinghoursCostConfig> subquery = cq.subquery(WorkinghoursCostConfig.class);
Root<WorkinghoursCostConfig> root2 = subquery.from(WorkinghoursCostConfig.class);
subquery.select(root2.<WorkinghoursCostConfig> get("projectName"));
//subquery.where(cb.equal(root2.get("enabledFlag"),1));
/*subquery.where(cb.equal(root2.get("enabledFlag"),1),cb.equal(root2.get("appid"),appid),cb.equal(root2.get("classOfProject"),"钣喷维修换件类"),cb.equal(root2.get("projectName"),"更换机盖")
);*/
List<Predicate> predicates2 = new ArrayList<>();
predicates2.add(cb.equal(root2.get("enabledFlag"), 1));
predicates2.add(cb.equal(root2.get("appid"), appid));
predicates2.add(cb.equal(root2.get("classOfProject"), "钣喷维修换件类"));
predicates2.add(cb.equal(root2.get("projectName"), "更换机盖"));
subquery.where(predicates2.toArray(new Predicate[predicates2.size()]));
//使用(in及notin)
predicates.add(cb.in(root.get("projectName")).value(subquery));
//predicates.add(cb.not(cb.in(root.get("projectName")).value(subquery)));
非子查询模式
//CriteriaBuilder之in及not in(非子查询模式)
Path<Object> path = root.get("studentStatus");
CriteriaBuilder.In<Object> in = cb.in(path);
in.value(-2);
in.value(-3);
in.value(5);
//predicates.add(cb.and(in));//in
predicates.add(cb.not(in));//not in
另外一种写法
import javax.persistence.criteria.CriteriaBuilder; //导入方法依赖的package包/类
@Override
public Predicate toPredicate(Criterion c, Root<?> r, CriteriaBuilder b) {Object o = c.getCompareTo();if(o == null)return b.not(r.get(c.getPropertyName()).in());if(o instanceof Collection)return b.not(r.get(c.getPropertyName()).in((Collection)o));throw new IllegalArgumentException(c.getPropertyName());
}
//参考:https://vimsky.com/examples/detail/java-method-javax.persistence.criteria.CriteriaBuilder.not.html
@Query注解的用法(Spring Data JPA)
方式一:?1
@Query(value = "select name,author,price from Book b where b.price>?1 and b.price<?2") List<Book> findByPriceRange(long price1, long price2);
方式二::name
@Query(value = "select name,author,price from Book b where b.name like %:name%") List<Book> findByNameMatch(@Param("name") String name);
方式三:in(使用in进行查询,则传入的参数必须是List,否则无法查询)
List<String> hqlIn = new ArrayList<>(Arrays.asList("张三","李四","王五"));
List<Employee> listE = employeeRepo.findEmployeeWorkerIn(hqlIn);@Query(value = "from Employee where enabledFlag=1 and userType='4' and employeeName in(?1) order by dbms_random.value()")
List<Employee> findEmployeeWorkerIn(List<String> hqlIn);
方式四:#{#entityName}
@Query(value = "select * from #{#entityName} b where b.name=?1", nativeQuery = true)
List<Book> findByName(String name);