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