java criteria and_java-jpa-criteriaBuilder使用

CriteriaBuilder criteriaBuilder =entityManager.getCriteriaBuilder();

//查询结果所需要的类型(Entity相对应)

CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Entity.class);

//查询所需要的主体类(Entity0相对应)

Root root = criteriaQuery.from(Entity0.class);

//查询结果-select(此处查询所有符合条件的主体类)

criteriaQuery.select(root);

//过滤条件用Predicate方法拼接

Predicate restrictions=criteriaBuilder.conjunction();

//过滤条件——equal(当Entity0关联member类时,Entity0:member=m:1)restrictions= criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("member"), member));//过滤条件——likerestrictions= criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("str"), "%"+str+"%"));//用户名查询(member里面的username匹配) ———— 多层查询 ———— 子查询的一种:适用于m:1或1:1(即多对一或一对一)restrictions= criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").get("username"), "%"+username+"%"));//子查询(规范写法,先判断查询内容是否存在)(适用于1:m)(即一对多)

if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {

//建立子查询

Subquery orderSubquery = criteriaQuery.subquery(Order.class);

Root orderSubqueryRoot = orderSubquery.from(Order.class);

orderSubquery.select(orderSubqueryRoot);

//子查询和父查询相关联

Predicate orderRestrictions= criteriaBuilder.equal(orderSubqueryRoot.get("mergeOrder"), root);//子查询过滤条件拼接

if (searchType != null && searchValue != null) {if ("phone".equals(searchType)) {

orderRestrictions= criteriaBuilder.and(orderRestrictions, criteriaBuilder.like(orderSubqueryRoot.get("phone"), "%"+searchValue+"%"));

}

}if (type != null) {

CriteriaBuilder.In in = criteriaBuilder.in(orderSubqueryRoot.get("type"));

in.value(type);

orderRestrictions=criteriaBuilder.and(orderRestrictions, in);

}//and、or以及判断是否为null,比较(>)的使用(比较可以用于日期比较)

if (hasExpired != null) {orderRestrictions= criteriaBuilder.and(orderRestrictions, criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull(), criteriaBuilder.greaterThan(orderSubqueryRoot.get("expire"), newDate())));

}//not的使用方法(不符合上述过滤条件),notEqual的使用,

if (isPendingReceive != null) {

restrictions= criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("paymentMethodType"), PaymentMethod.Type.cashOnDelivery));

Predicate predicate= criteriaBuilder.and(criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull()

, criteriaBuilder.greaterThan(orderSubqueryRoot.get("expire"), newDate()))

, criteriaBuilder.notEqual(orderSubqueryRoot.get("status"), Order.Status.completed), criteriaBuilder.lessThan(orderSubqueryRoot.get("amountPaid"), orderSubqueryRoot.get("amount")));if(isPendingReceive) {orderRestrictions=criteriaBuilder.and(orderRestrictions, criteriaBuilder.not(predicate));

}

}//多层查询使用if (businessType != null) {

orderRestrictions= criteriaBuilder.and(orderRestrictions, criteriaBuilder.equal(orderSubqueryRoot.get("store").get("business").get("businessType"), businessType));

}

// 拼接过滤条件

orderSubquery.where(orderRestrictions);//和总条件拼接(exists的使用)

restrictions =criteriaBuilder.and(restrictions, criteriaBuilder.exists(orderSubquery));

}criteriaQuery.where(restrictions);     TypedQuery query = entityManager.createQuery(criteriaQuery);

Entity singleResult = query.getSingleResult();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值