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+ return hql .toString ();
54+ }
55+
56+
57+ private void buildSQL (Filter filter , StringBuilder hql ) {
58+ if (filter .isOrFilters ()) {
59+ Filter [] orFilters = (Filter []) filter .getValue ();
60+ if (orFilters .length > 0 ) {
61+ hql .append (" ( " );
62+ for (int i = 0 ; i < orFilters .length ; i ++) {
63+ Filter orFilter = orFilters [i ];
64+ this .buildSQL (orFilter , hql );
65+ if (i != orFilters .length - 1 ) {
66+ hql .append (" OR " );
67+ }
68+
69+ }
70+ hql .append (" )" );
71+ }
72+ }
73+
74+ if (filter .isAndFilters ()) {
75+ Filter [] andFilters = (Filter []) filter .getValue ();
76+ if (andFilters .length > 0 ) {
77+ hql .append (" ( " );
78+ for (int i = 0 ; i < andFilters .length ; i ++) {
79+ Filter andFilter = andFilters [i ];
80+ this .buildSQL (andFilter , hql );
81+ if (i != andFilters .length - 1 ) {
82+ hql .append (" AND " );
83+ }
84+ }
85+ hql .append (" )" );
86+ }
87+ }
88+
89+ if (filter .isEqual ()) {
90+ hql .append (filter .getKey ()).append (" = ?" ).append (paramIndex );
91+ params .add (filter .getValue ()[0 ]);
92+ paramIndex ++;
93+ }
94+ if (filter .isLike ()) {
95+ hql .append (filter .getKey ()).append (" LIKE ?" ).append (paramIndex );
96+ params .add ("%" + filter .getValue ()[0 ] + "%" );
97+ paramIndex ++;
98+ }
99+ if (filter .isIn ()) {
100+ hql .append (filter .getKey ()).append (" IN (" ).append ("?" ).append (paramIndex ).append (")" );
101+ params .add (Arrays .asList (filter .getValue ()));
102+ paramIndex ++;
103+ }
104+ if (filter .isGreaterThan ()) {
105+ hql .append (filter .getKey ()).append (" > ?" ).append (paramIndex );
106+ params .add (filter .getValue ()[0 ]);
107+ paramIndex ++;
108+ }
109+ if (filter .isLessThan ()) {
110+ hql .append (filter .getKey ()).append (" < ?" ).append (paramIndex );
111+ params .add (filter .getValue ()[0 ]);
112+ paramIndex ++;
113+ }
114+ if (filter .isGreaterThanEqual ()) {
115+ hql .append (filter .getKey ()).append (" >= ?" ).append (paramIndex );
116+ params .add (filter .getValue ()[0 ]);
117+ paramIndex ++;
118+ }
119+ if (filter .isLessThanEqual ()) {
120+ hql .append (filter .getKey ()).append (" <= ?" ).append (paramIndex );
121+ params .add (filter .getValue ()[0 ]);
122+ paramIndex ++;
123+ }
124+ if (filter .isBetween ()) {
125+ hql .append (filter .getKey ()).append (" BETWEEN ?" ).append (paramIndex ).append (" AND ?" ).append (paramIndex + 1 );
126+ params .add (filter .getValue ()[0 ]);
127+ params .add (filter .getValue ()[1 ]);
128+ paramIndex += 2 ;
129+ }
130+ }
131+
132+
133+ public Object [] getParams () {
134+ return params .toArray ();
135+ }
136+ }
0 commit comments