Commit 61cfd0d63bd991ca6d694805029efe6c9de083a4

Authored by 王通
1 parent 643f5349

1.PredicatesBuilder in条件表达式修正

src/main/java/com/bsth/entity/search/PredicatesBuilder.java
1 -package com.bsth.entity.search;  
2 -  
3 -import org.joda.time.DateTime;  
4 -  
5 -import javax.persistence.criteria.CriteriaBuilder;  
6 -import javax.persistence.criteria.Path;  
7 -import javax.persistence.criteria.Predicate;  
8 -import java.text.NumberFormat;  
9 -import java.text.ParseException;  
10 -import java.text.SimpleDateFormat;  
11 -import java.util.ArrayList;  
12 -import java.util.Calendar;  
13 -import java.util.Date;  
14 -import java.util.List;  
15 -  
16 -/**  
17 - *  
18 - * @ClassName: PredicatesBuilder  
19 - * @author PanZhao  
20 - * @date 2016年3月16日 下午4:05:07  
21 - *  
22 - */  
23 -public class PredicatesBuilder {  
24 -  
25 - /**  
26 - * Number转换器  
27 - */  
28 - private static NumberFormat nf;  
29 -  
30 - static{  
31 - nf = NumberFormat.getInstance();  
32 - }  
33 -  
34 - public static Predicate eq(CriteriaBuilder cb,Path<?> expression, Object object){  
35 - Class<?> leftType = expression.getJavaType();  
36 - Class<?> rightType = object.getClass();  
37 -  
38 - if(Date.class.isAssignableFrom(leftType) &&  
39 - String.class.isAssignableFrom(rightType)){  
40 - DateTime dateTime = new DateTime(object);  
41 - return cb.equal(expression, dateTime.toDate());  
42 - }  
43 - else {  
44 - return cb.equal(expression, object);  
45 - }  
46 -  
47 - /*if (Number.class.isAssignableFrom(leftType) &&  
48 - (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number == Number/String  
49 - return cb.equal(expression, object);  
50 - } else if (String.class.isAssignableFrom(leftType) &&  
51 - (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String == String/Number  
52 - return cb.equal(expression, object);  
53 - } else if (Boolean.class.isAssignableFrom(leftType) &&  
54 - Boolean.class.isAssignableFrom(rightType)) {  
55 - return cb.equal(expression, object);  
56 - } else if (Date.class.isAssignableFrom(leftType) &&  
57 - Date.class.isAssignableFrom(rightType)) { // Date == Date  
58 - return cb.equal(expression, object);  
59 - } else if (Date.class.isAssignableFrom(leftType) &&  
60 - String.class.isAssignableFrom(rightType)) { // Date == String  
61 - DateTime dateTime = new DateTime(object);  
62 - return cb.equal(expression, dateTime.toDate());  
63 - } else {  
64 - throw new RuntimeException("eq 不支持类型组合:" + expression.getJavaType() + "==" + object.getClass());  
65 - }*/  
66 - }  
67 -  
68 - public static Predicate ne(CriteriaBuilder cb,Path<?> expression, Object object){  
69 - return cb.notEqual(expression, object);  
70 - }  
71 -  
72 - public static Predicate in(CriteriaBuilder cb,Path<?> expression, Object object){  
73 - String[] obj=object.toString().split(",");  
74 - List<String> list=new ArrayList<String>();  
75 - for(int i=0;i<obj.length;i++){  
76 - list.add(obj[i]);  
77 - }  
78 - return cb.in(expression).value(list);  
79 - }  
80 -  
81 -  
82 - public static Predicate ins(CriteriaBuilder cb,Path<?> expression, List<String> list){  
83 - return cb.in(expression).value(list);  
84 - }  
85 -  
86 - public static Predicate gt(CriteriaBuilder cb,Path<Number> expression, Object object){  
87 - try {  
88 - return cb.gt(expression, nf.parse(object.toString()));  
89 - } catch (ParseException e) {  
90 - e.printStackTrace();  
91 - return null;  
92 - }  
93 - }  
94 -  
95 - public static Predicate ge(CriteriaBuilder cb,Path<?> expression, Object object){  
96 - Class<?> leftType = expression.getJavaType();  
97 - Class<?> rightType = object.getClass();  
98 -  
99 - if (Number.class.isAssignableFrom(leftType) &&  
100 - (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number >= Number/String  
101 - return cb.ge((Path<Number>) expression, (Number) object);  
102 - } else if (String.class.isAssignableFrom(leftType) &&  
103 - (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String >= String/Number  
104 - return cb.greaterThanOrEqualTo((Path<String>) expression, (String) object);  
105 - } else if (Date.class.isAssignableFrom(leftType) &&  
106 - Date.class.isAssignableFrom(rightType)) { // Date >= Date  
107 - return cb.greaterThanOrEqualTo((Path<Date>) expression, (Date) object);  
108 - } else if (Date.class.isAssignableFrom(leftType) &&  
109 - String.class.isAssignableFrom(rightType)) { // Date >= String  
110 - DateTime dateTime = new DateTime(object);  
111 - return cb.greaterThanOrEqualTo((Path<Date>) expression, dateTime.toDate());  
112 - } else if (long.class.isAssignableFrom(leftType) &&  
113 - String.class.isAssignableFrom(rightType)) { // Long >= String  
114 - return cb.greaterThanOrEqualTo((Path<Long>) expression, Long.valueOf(object+""));  
115 - } else {  
116 - throw new RuntimeException("ge 不支持类型组合:" + expression.getJavaType() + ">=" + object.getClass());  
117 - }  
118 - }  
119 -  
120 - public static Predicate lt(CriteriaBuilder cb,Path<Number> expression, Object object){  
121 - try {  
122 - return cb.lt(expression, nf.parse(object.toString()));  
123 - } catch (ParseException e) {  
124 - e.printStackTrace();  
125 - return null;  
126 - }  
127 - }  
128 -  
129 - public static Predicate le(CriteriaBuilder cb,Path<?> expression, Object object){  
130 - Class<?> leftType = expression.getJavaType();  
131 - Class<?> rightType = object.getClass();  
132 -  
133 -  
134 - if (Number.class.isAssignableFrom(leftType) &&  
135 - (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number <= Number/String  
136 - return cb.le((Path<Number>) expression, (Number) object);  
137 - } else if (String.class.isAssignableFrom(leftType) &&  
138 - (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String <= String/Number  
139 - return cb.lessThanOrEqualTo((Path<String>) expression, (String) object);  
140 - } else if (Date.class.isAssignableFrom(leftType) &&  
141 - Date.class.isAssignableFrom(rightType)) { // Date <= Date  
142 - return cb.lessThanOrEqualTo((Path<Date>) expression, (Date) object);  
143 - } else if (Date.class.isAssignableFrom(leftType) &&  
144 - String.class.isAssignableFrom(rightType)) { // Date <= String  
145 - DateTime dateTime = new DateTime(object);  
146 - return cb.lessThanOrEqualTo((Path<Date>) expression, dateTime.toDate());  
147 - }else if (long.class.isAssignableFrom(leftType) &&  
148 - String.class.isAssignableFrom(rightType)) { // Long <= String  
149 - return cb.lessThanOrEqualTo((Path<Long>) expression, Long.valueOf(object + "") );  
150 - } else {  
151 - throw new RuntimeException("le 不支持类型组合:" + expression.getJavaType() + "<=" + object.getClass());  
152 - }  
153 - }  
154 -  
155 - public static Predicate prefixLike(CriteriaBuilder cb,Path<String> expression, Object object){  
156 - return cb.like(expression, object.toString() + "%");  
157 - }  
158 -  
159 - public static Predicate prefixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){  
160 - return cb.notLike(expression, object.toString() + "%");  
161 - }  
162 -  
163 - public static Predicate suffixLike(CriteriaBuilder cb,Path<String> expression, Object object){  
164 - return cb.like(expression, "%" + object.toString());  
165 - }  
166 -  
167 - public static Predicate suffixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){  
168 - return cb.notLike(expression, "%" + object.toString());  
169 - }  
170 -  
171 - public static Predicate like(CriteriaBuilder cb,Path<String> expression, Object object){  
172 - return cb.like(expression, "%" + object.toString() + "%");  
173 - }  
174 -  
175 - public static Predicate notLike(CriteriaBuilder cb,Path<String> expression, Object object){  
176 - return cb.notLike(expression, "%" + object.toString() + "%");  
177 - }  
178 -  
179 - public static Predicate isNull(CriteriaBuilder cb,Path<String> expression, Object object){  
180 - return cb.isNull(expression);  
181 - }  
182 -  
183 - public static Predicate isNotNull(CriteriaBuilder cb,Path<String> expression, Object object){  
184 - return cb.isNotNull(expression);  
185 - }  
186 -  
187 - public static Predicate isf(CriteriaBuilder cb,Path<Boolean> expression, Object object){  
188 - return cb.isFalse(expression);  
189 - }  
190 -  
191 - public static Predicate ist(CriteriaBuilder cb,Path<Boolean> expression, Object object){  
192 - return cb.isTrue(expression);  
193 - }  
194 -  
195 - public static Predicate date(CriteriaBuilder cb,Path<?> expression, Object object){  
196 - Date time = null;  
197 - try {  
198 - SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");  
199 - time = sdf.parse(object.toString());  
200 - } catch (Exception e) {  
201 - e.printStackTrace();  
202 - }  
203 - return cb.equal(expression, time);  
204 - }  
205 -  
206 - public static Predicate dateEq(CriteriaBuilder cb,Path<?> expression, Object object){  
207 - Predicate predicate = null;  
208 - try {  
209 - DateTime dateTime = new DateTime(object);  
210 - Date startTime = dateTime.toDate();//设置起始时间  
211 - Calendar c = Calendar.getInstance();  
212 - c.setTime(startTime);  
213 - c.add(Calendar.DAY_OF_MONTH, 1);  
214 - // 设置结束时间,起始时间为结束时间加1天  
215 - Date endTime = c.getTime();  
216 - predicate = cb.between((Path<Date>) expression,startTime,endTime);  
217 - } catch (Exception e) {  
218 - e.printStackTrace();  
219 - }  
220 - return predicate;  
221 - }  
222 -} 1 +package com.bsth.entity.search;
  2 +
  3 +import org.apache.poi.ss.formula.functions.T;
  4 +import org.joda.time.DateTime;
  5 +
  6 +import javax.persistence.criteria.CriteriaBuilder;
  7 +import javax.persistence.criteria.Path;
  8 +import javax.persistence.criteria.Predicate;
  9 +import java.text.NumberFormat;
  10 +import java.text.ParseException;
  11 +import java.text.SimpleDateFormat;
  12 +import java.util.*;
  13 +
  14 +/**
  15 + *
  16 + * @ClassName: PredicatesBuilder
  17 + * @author PanZhao
  18 + * @date 2016年3月16日 下午4:05:07
  19 + *
  20 + */
  21 +public class PredicatesBuilder {
  22 +
  23 + /**
  24 + * Number转换器
  25 + */
  26 + private static NumberFormat nf;
  27 +
  28 + static{
  29 + nf = NumberFormat.getInstance();
  30 + }
  31 +
  32 + public static Predicate eq(CriteriaBuilder cb,Path<?> expression, Object object){
  33 + Class<?> leftType = expression.getJavaType();
  34 + Class<?> rightType = object.getClass();
  35 +
  36 + if(Date.class.isAssignableFrom(leftType) &&
  37 + String.class.isAssignableFrom(rightType)){
  38 + DateTime dateTime = new DateTime(object);
  39 + return cb.equal(expression, dateTime.toDate());
  40 + }
  41 + else {
  42 + return cb.equal(expression, object);
  43 + }
  44 +
  45 + /*if (Number.class.isAssignableFrom(leftType) &&
  46 + (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number == Number/String
  47 + return cb.equal(expression, object);
  48 + } else if (String.class.isAssignableFrom(leftType) &&
  49 + (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String == String/Number
  50 + return cb.equal(expression, object);
  51 + } else if (Boolean.class.isAssignableFrom(leftType) &&
  52 + Boolean.class.isAssignableFrom(rightType)) {
  53 + return cb.equal(expression, object);
  54 + } else if (Date.class.isAssignableFrom(leftType) &&
  55 + Date.class.isAssignableFrom(rightType)) { // Date == Date
  56 + return cb.equal(expression, object);
  57 + } else if (Date.class.isAssignableFrom(leftType) &&
  58 + String.class.isAssignableFrom(rightType)) { // Date == String
  59 + DateTime dateTime = new DateTime(object);
  60 + return cb.equal(expression, dateTime.toDate());
  61 + } else {
  62 + throw new RuntimeException("eq 不支持类型组合:" + expression.getJavaType() + "==" + object.getClass());
  63 + }*/
  64 + }
  65 +
  66 + public static Predicate ne(CriteriaBuilder cb,Path<?> expression, Object object){
  67 + return cb.notEqual(expression, object);
  68 + }
  69 +
  70 + public static Predicate in(CriteriaBuilder cb, Path<?> expression, Object object) {
  71 + String[] obj = object.toString().split(",");
  72 +
  73 + return ins(cb, expression, Arrays.asList(obj));
  74 + }
  75 +
  76 +
  77 + public static Predicate ins(CriteriaBuilder cb, Path<?> expression, List<String> list) {
  78 + CriteriaBuilder.In<Object> in = cb.in(expression);
  79 + for(int i = 0; i < list.size(); i++){
  80 + in.value(list.get(i));
  81 + }
  82 +
  83 + return in;
  84 + }
  85 +
  86 + public static Predicate gt(CriteriaBuilder cb,Path<Number> expression, Object object){
  87 + try {
  88 + return cb.gt(expression, nf.parse(object.toString()));
  89 + } catch (ParseException e) {
  90 + e.printStackTrace();
  91 + return null;
  92 + }
  93 + }
  94 +
  95 + public static Predicate ge(CriteriaBuilder cb,Path<?> expression, Object object){
  96 + Class<?> leftType = expression.getJavaType();
  97 + Class<?> rightType = object.getClass();
  98 +
  99 + if (Number.class.isAssignableFrom(leftType) &&
  100 + (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number >= Number/String
  101 + return cb.ge((Path<Number>) expression, (Number) object);
  102 + } else if (String.class.isAssignableFrom(leftType) &&
  103 + (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String >= String/Number
  104 + return cb.greaterThanOrEqualTo((Path<String>) expression, (String) object);
  105 + } else if (Date.class.isAssignableFrom(leftType) &&
  106 + Date.class.isAssignableFrom(rightType)) { // Date >= Date
  107 + return cb.greaterThanOrEqualTo((Path<Date>) expression, (Date) object);
  108 + } else if (Date.class.isAssignableFrom(leftType) &&
  109 + String.class.isAssignableFrom(rightType)) { // Date >= String
  110 + DateTime dateTime = new DateTime(object);
  111 + return cb.greaterThanOrEqualTo((Path<Date>) expression, dateTime.toDate());
  112 + } else if (long.class.isAssignableFrom(leftType) &&
  113 + String.class.isAssignableFrom(rightType)) { // Long >= String
  114 + return cb.greaterThanOrEqualTo((Path<Long>) expression, Long.valueOf(object+""));
  115 + } else {
  116 + throw new RuntimeException("ge 不支持类型组合:" + expression.getJavaType() + ">=" + object.getClass());
  117 + }
  118 + }
  119 +
  120 + public static Predicate lt(CriteriaBuilder cb,Path<Number> expression, Object object){
  121 + try {
  122 + return cb.lt(expression, nf.parse(object.toString()));
  123 + } catch (ParseException e) {
  124 + e.printStackTrace();
  125 + return null;
  126 + }
  127 + }
  128 +
  129 + public static Predicate le(CriteriaBuilder cb,Path<?> expression, Object object){
  130 + Class<?> leftType = expression.getJavaType();
  131 + Class<?> rightType = object.getClass();
  132 +
  133 +
  134 + if (Number.class.isAssignableFrom(leftType) &&
  135 + (Number.class.isAssignableFrom(rightType) || String.class.isAssignableFrom(rightType))) { // Number <= Number/String
  136 + return cb.le((Path<Number>) expression, (Number) object);
  137 + } else if (String.class.isAssignableFrom(leftType) &&
  138 + (String.class.isAssignableFrom(rightType) || Number.class.isAssignableFrom(rightType))) { // String <= String/Number
  139 + return cb.lessThanOrEqualTo((Path<String>) expression, (String) object);
  140 + } else if (Date.class.isAssignableFrom(leftType) &&
  141 + Date.class.isAssignableFrom(rightType)) { // Date <= Date
  142 + return cb.lessThanOrEqualTo((Path<Date>) expression, (Date) object);
  143 + } else if (Date.class.isAssignableFrom(leftType) &&
  144 + String.class.isAssignableFrom(rightType)) { // Date <= String
  145 + DateTime dateTime = new DateTime(object);
  146 + return cb.lessThanOrEqualTo((Path<Date>) expression, dateTime.toDate());
  147 + }else if (long.class.isAssignableFrom(leftType) &&
  148 + String.class.isAssignableFrom(rightType)) { // Long <= String
  149 + return cb.lessThanOrEqualTo((Path<Long>) expression, Long.valueOf(object + "") );
  150 + } else {
  151 + throw new RuntimeException("le 不支持类型组合:" + expression.getJavaType() + "<=" + object.getClass());
  152 + }
  153 + }
  154 +
  155 + public static Predicate prefixLike(CriteriaBuilder cb,Path<String> expression, Object object){
  156 + return cb.like(expression, object.toString() + "%");
  157 + }
  158 +
  159 + public static Predicate prefixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){
  160 + return cb.notLike(expression, object.toString() + "%");
  161 + }
  162 +
  163 + public static Predicate suffixLike(CriteriaBuilder cb,Path<String> expression, Object object){
  164 + return cb.like(expression, "%" + object.toString());
  165 + }
  166 +
  167 + public static Predicate suffixNotLike(CriteriaBuilder cb,Path<String> expression, Object object){
  168 + return cb.notLike(expression, "%" + object.toString());
  169 + }
  170 +
  171 + public static Predicate like(CriteriaBuilder cb,Path<String> expression, Object object){
  172 + return cb.like(expression, "%" + object.toString() + "%");
  173 + }
  174 +
  175 + public static Predicate notLike(CriteriaBuilder cb,Path<String> expression, Object object){
  176 + return cb.notLike(expression, "%" + object.toString() + "%");
  177 + }
  178 +
  179 + public static Predicate isNull(CriteriaBuilder cb,Path<String> expression, Object object){
  180 + return cb.isNull(expression);
  181 + }
  182 +
  183 + public static Predicate isNotNull(CriteriaBuilder cb,Path<String> expression, Object object){
  184 + return cb.isNotNull(expression);
  185 + }
  186 +
  187 + public static Predicate isf(CriteriaBuilder cb,Path<Boolean> expression, Object object){
  188 + return cb.isFalse(expression);
  189 + }
  190 +
  191 + public static Predicate ist(CriteriaBuilder cb,Path<Boolean> expression, Object object){
  192 + return cb.isTrue(expression);
  193 + }
  194 +
  195 + public static Predicate date(CriteriaBuilder cb,Path<?> expression, Object object){
  196 + Date time = null;
  197 + try {
  198 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  199 + time = sdf.parse(object.toString());
  200 + } catch (Exception e) {
  201 + e.printStackTrace();
  202 + }
  203 + return cb.equal(expression, time);
  204 + }
  205 +
  206 + public static Predicate dateEq(CriteriaBuilder cb,Path<?> expression, Object object){
  207 + Predicate predicate = null;
  208 + try {
  209 + DateTime dateTime = new DateTime(object);
  210 + Date startTime = dateTime.toDate();//设置起始时间
  211 + Calendar c = Calendar.getInstance();
  212 + c.setTime(startTime);
  213 + c.add(Calendar.DAY_OF_MONTH, 1);
  214 + // 设置结束时间,起始时间为结束时间加1天
  215 + Date endTime = c.getTime();
  216 + predicate = cb.between((Path<Date>) expression,startTime,endTime);
  217 + } catch (Exception e) {
  218 + e.printStackTrace();
  219 + }
  220 + return predicate;
  221 + }
  222 +}