开心一笑: 会买水果的狗狗

    关注微信公众号

    QQ群:831045818

    app下载

    当前位置:首页> java > 技术文档 > 正文
    JPA CriteriaBuilder or 与 and 组合使用
    发布时间:2020-03-16 11:09:34.0 浏览次数:
    CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder();  
    CriteriaQuery cq = cb.createQuery(Employee.class);  
    Root root = cq.from(Employee.class);  
    Path p_a = root.get("a");  
    Path p_b = root.get("b");  
    Path p_c = root.get("c");  
    Predicate p = cb.and(cb.equal(p_a , "1"),  cb.equal(p_b , "2"));  
    p = cb.or(cb.equal(p_c , "3"), p);  
    
    效果
    where  
            employee.c = "3"  
            or employee.a = "1"  
            and employee.b = "2" 
    
    方式2
    CriteriaBuilder cb = this.entityManager.getCriteriaBuilder();
    CriteriaQuery cq = cb.createQuery(User.class);
    Root root = cq.from(User.class);
    Path username = root.get("username");
    Path password = root.get("password");
    Path baseInfoRealname = root.get("username");
    Predicate p = cb.and(cb.equal(username, "zang"), cb.equal(password, "zang"));
    p = cb.or(p, cb.equal(baseInfoRealname, "li"));
    entityManager.createQuery(cq.where(p)).getResultList();
    效果
    where  
            employee.c = "3"  
            or (  
                  employee.a = "1"  
                  and employee.b = "2"  
              ) 
    等同
    select generatedAlias0 from User as generatedAlias0 where ( ( generatedAlias0.username=:param0 ) and ( generatedAlias0.password=:param1 ) ) or ( generatedAlias0.username=:param2 )
    
    实际代码
    public UserInfo getLoginUser(UserDao userDao,String str){
            Specification query = new Specification() {
                @Override
                public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder criteriaBuilder) {
                    Predicate predicate=criteriaBuilder.conjunction();
                    //用户名
                    if(StringUtils.isNotEmpty(str)){
                        predicate=criteriaBuilder.and(criteriaBuilder.equal(root.get("userName"),str));
                        predicate=criteriaBuilder.or(predicate,criteriaBuilder.or(criteriaBuilder.equal(root.get("phone"),str)));
                        predicate=criteriaBuilder.or(predicate,criteriaBuilder.or(criteriaBuilder.equal(root.get("email"),str)));
                    }
                    return predicate;
                }
            };
    
            System.out.println(query.toString());
            return (UserInfo)userDao.findOne(query);
        }
    select userinfo0_.user_id as user_id1_0_, userinfo0_.email as email2_0_, userinfo0_.group_id as group_id3_0_, userinfo0_.login_count as login_co4_0_, userinfo0_.name as name5_0_, userinfo0_.password as password6_0_, userinfo0_.phone as phone7_0_, userinfo0_.register_ip as register8_0_, userinfo0_.register_time as register9_0_, userinfo0_.salt as salt10_0_, userinfo0_.upload_total as upload_11_0_, userinfo0_.user_name as user_na12_0_ from t_backstageuser userinfo0_ where userinfo0_.user_name=? or userinfo0_.phone=? or userinfo0_.email=?
    
    
    // Create path and parameter expressions:
      Expression<Integer> path = country.get("population");
      Expression<Integer> param = cb.parameter(Integer.class);
    
      // Addition (+)
      Expression<Integer> sum1 = cb.sum(path, param); // expression + expression
      Expression<Integer> sum2 = cb.sum(path, 1000); // expression + number
      Expression<Integer> sum3 = cb.sum(1000, path); // number + expression
    
      // Subtraction (-)
      Expression<Integer> diff1 = cb.diff(path, param); // expression - expression
      Expression<Integer> diff2 = cb.diff(path, 1000); // expression - number
      Expression<Integer> diff3 = cb.diff(1000, path); // number - expression
    
      // Multiplication (*)
      Expression<Integer> prod1 = cb.prod(path, param); // expression * expression
      Expression<Integer> prod2 = cb.prod(path, 1000); // expression * number
      Expression<Integer> prod3 = cb.prod(1000, path); // number * expression
    
      // Division (/)
      Expression<Integer> quot1 = cb.quot(path, param); // expression / expression
      Expression<Integer> quot2 = cb.quot(path, 1000); // expression / number
      Expression<Integer> quot3 = cb.quot(1000, path); // number / expression
    
      // Modulo (%)
      Expression<Integer> mod1 = cb.mod(path, param); // expression % expression
      Expression<Integer> mod2 = cb.mod(path, 1000); // expression % number
      Expression<Integer> mod3 = cb.mod(1000, path); // number % expression
    
      // Math(abs, exp, sqrt)
      Expression<Integer> abs = cb.abs(param); // 求绝对值ABS(expression)
      Expression<Integer> neg = cb.neg(path); // 求相反数 -expression
      Expression<Integer> sqrt = cb.sqrt(cb.literal(100)); //求平方根 SQRT(expression)
    
      
      //由于CriteriaBuilder提供的加减乘除方法的名字和平常使用的不太一样,所以用了好久才找出来。单字段求和可以直接使用
      CriteriaBuilder cb = em.getCriteriaBuilder();Expression<Number> sum = cb.sum(root.get(字段名)).alias(别名)
    
    前边也说了需求是用金额(amount)除以单价(unitPrice),然后求和,所以这时需要先用amount除以unitPrice
    Expression<Number> quot = cb.quot(root.get("amount"), root.get("unitPrice"));
    
      case ':': return EQUALITY;
          case '!': return NEGATION;
          case '>': return GREATER_THAN;
          case '<': return LESS_THAN;
          case '~': return LIKE;


    关注"都市百货" 了解南陵

    微信咨询wanglf2r(不拉群 发广告者勿加)

    0
    0
    上一篇:南陵乡村公交恢复至丫山 烟墩 弋江 乌霞寺 太丰 东七 奚滩公交线路 上一篇:JPA Entity 注解

    评论已有0

    提交评论

    热门评论

    南陵新闻
    公示公告
    常用查询
    风光南陵
    走出南陵
    友情链接