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(不拉群 发广告者勿加)
热门评论