1
+ package com .codingapi .springboot .fast .jpa .repository ;
2
+
3
+ import com .codingapi .springboot .framework .dto .request .Filter ;
4
+ import com .codingapi .springboot .framework .dto .request .PageRequest ;
5
+ import com .codingapi .springboot .framework .dto .request .RequestFilter ;
6
+ import org .springframework .data .domain .Sort ;
7
+
8
+ import java .util .ArrayList ;
9
+ import java .util .Arrays ;
10
+ import java .util .List ;
11
+
12
+ public class DynamicRequest {
13
+
14
+ private final PageRequest request ;
15
+ private final Class <?> clazz ;
16
+
17
+ private final List <Object > params = new ArrayList <>();
18
+ private int paramIndex = 1 ;
19
+
20
+ public DynamicRequest (PageRequest request , Class <?> clazz ) {
21
+ this .request = request ;
22
+ this .clazz = clazz ;
23
+ }
24
+
25
+
26
+ public String getHql () {
27
+ StringBuilder hql = new StringBuilder ("FROM " + clazz .getSimpleName () + " WHERE " );
28
+ RequestFilter requestFilter = request .getRequestFilter ();
29
+ if (requestFilter .hasFilter ()) {
30
+ List <Filter > filters = requestFilter .getFilters ();
31
+ for (int i = 0 ; i < filters .size (); i ++) {
32
+ Filter filter = filters .get (i );
33
+ this .buildSQL (filter , hql );
34
+ if (i != filters .size () - 1 ) {
35
+ hql .append (" AND " );
36
+ }
37
+ }
38
+ }
39
+
40
+ Sort sort = request .getSort ();
41
+ if (sort .isSorted ()) {
42
+ hql .append (" ORDER BY " );
43
+ List <Sort .Order > orders = sort .toList ();
44
+ for (int i = 0 ; i < orders .size (); i ++) {
45
+ Sort .Order order = orders .get (i );
46
+ hql .append (order .getProperty ()).append (" " ).append (order .getDirection ().name ());
47
+ if (i != orders .size () - 1 ) {
48
+ hql .append ("," );
49
+ }
50
+ }
51
+ }
52
+
53
+ System .out .println (hql .toString ());
54
+ System .out .println (params );
55
+ return hql .toString ();
56
+ }
57
+
58
+
59
+ private void buildSQL (Filter filter , StringBuilder hql ) {
60
+ if (filter .isOrFilters ()) {
61
+ Filter [] orFilters = (Filter []) filter .getValue ();
62
+ if (orFilters .length > 0 ) {
63
+ hql .append (" ( " );
64
+ for (int i = 0 ; i < orFilters .length ; i ++) {
65
+ Filter orFilter = orFilters [i ];
66
+ this .buildSQL (orFilter , hql );
67
+ if (i != orFilters .length - 1 ) {
68
+ hql .append (" OR " );
69
+ }
70
+
71
+ }
72
+ hql .append (" )" );
73
+ }
74
+ }
75
+
76
+ if (filter .isAndFilters ()) {
77
+ Filter [] andFilters = (Filter []) filter .getValue ();
78
+ if (andFilters .length > 0 ) {
79
+ hql .append (" ( " );
80
+ for (int i = 0 ; i < andFilters .length ; i ++) {
81
+ Filter andFilter = andFilters [i ];
82
+ this .buildSQL (andFilter , hql );
83
+ if (i != andFilters .length - 1 ) {
84
+ hql .append (" AND " );
85
+ }
86
+ }
87
+ hql .append (" )" );
88
+ }
89
+ }
90
+
91
+ if (filter .isEqual ()) {
92
+ hql .append (filter .getKey ()).append (" = ?" ).append (paramIndex );
93
+ params .add (filter .getValue ()[0 ]);
94
+ paramIndex ++;
95
+ }
96
+ if (filter .isLike ()) {
97
+ hql .append (filter .getKey ()).append (" LIKE ?" ).append (paramIndex );
98
+ params .add ("%" + filter .getValue ()[0 ] + "%" );
99
+ paramIndex ++;
100
+ }
101
+ if (filter .isIn ()) {
102
+ hql .append (filter .getKey ()).append (" IN (" ).append ("?" ).append (paramIndex ).append (")" );
103
+ params .add (Arrays .asList (filter .getValue ()));
104
+ paramIndex ++;
105
+ }
106
+ if (filter .isGreaterThan ()) {
107
+ hql .append (filter .getKey ()).append (" > ?" ).append (paramIndex );
108
+ params .add (filter .getValue ()[0 ]);
109
+ paramIndex ++;
110
+ }
111
+ if (filter .isLessThan ()) {
112
+ hql .append (filter .getKey ()).append (" < ?" ).append (paramIndex );
113
+ params .add (filter .getValue ()[0 ]);
114
+ paramIndex ++;
115
+ }
116
+ if (filter .isGreaterThanEqual ()) {
117
+ hql .append (filter .getKey ()).append (" >= ?" ).append (paramIndex );
118
+ params .add (filter .getValue ()[0 ]);
119
+ paramIndex ++;
120
+ }
121
+ if (filter .isLessThanEqual ()) {
122
+ hql .append (filter .getKey ()).append (" <= ?" ).append (paramIndex );
123
+ params .add (filter .getValue ()[0 ]);
124
+ paramIndex ++;
125
+ }
126
+ if (filter .isBetween ()) {
127
+ hql .append (filter .getKey ()).append (" BETWEEN ?" ).append (paramIndex ).append (" AND ?" ).append (paramIndex + 1 );
128
+ params .add (filter .getValue ()[0 ]);
129
+ params .add (filter .getValue ()[1 ]);
130
+ paramIndex += 2 ;
131
+ }
132
+ }
133
+
134
+
135
+ public Object [] getParams () {
136
+ return params .toArray ();
137
+ }
138
+ }
0 commit comments