88import java .util .Map .Entry ;
99import java .util .Set ;
1010import java .util .function .Function ;
11+ import java .util .stream .Collectors ;
1112
1213import javax .persistence .EntityManager ;
1314import javax .persistence .EntityManagerFactory ;
1617import javax .persistence .Query ;
1718import javax .persistence .TypedQuery ;
1819
20+ import org .mapstruct .ap .internal .util .Strings ;
21+
1922import info .unterrainer .commons .httpserver .exceptions .ForbiddenException ;
2023import info .unterrainer .commons .httpserver .exceptions .InternalServerErrorException ;
2124import info .unterrainer .commons .httpserver .jsons .ListJson ;
2427import info .unterrainer .commons .rdbutils .enums .AsyncState ;
2528import io .javalin .http .Context ;
2629import lombok .Getter ;
30+ import lombok .extern .slf4j .Slf4j ;
2731
32+ @ Slf4j
2833public class JpqlCoreDao <P extends BasicJpa > implements CoreDao <P , EntityManager > {
2934
3035 protected final Class <P > type ;
@@ -136,6 +141,7 @@ <T> TypedQuery<T> getQuery(final EntityManager em, final String selectClause, St
136141 else if (!orderBy .isBlank ())
137142 query += " ORDER BY " + orderBy ;
138143
144+ log .debug ("Query is: [{}]" , query );
139145 query = String .format (query , this .type .getSimpleName ());
140146
141147 @ SuppressWarnings ("unchecked" )
@@ -146,12 +152,24 @@ else if (!orderBy.isBlank())
146152 TypedQuery <T > q = em .createQuery (query , t );
147153 if (lockPessimistic )
148154 q .setLockMode (LockModeType .PESSIMISTIC_WRITE );
149- q = addAsyncStatesParamsToQuery (asyncStates , q );
155+
156+ log .debug (" with lockmode: [{}]" , q .getLockMode ());
157+
158+ if (asyncStates != null )
159+ log .debug (" with asynchronous_state: [{}]" ,
160+ Strings .join (asyncStates .stream ().map (AsyncState ::toString ).collect (Collectors .toList ()), ", " ));
161+ addAsyncStatesParamsToQuery (asyncStates , q );
150162
151163 params = addTenantParams (params , tenantIds );
152- if (params != null )
164+ if (params != null ) {
165+ log .debug (" with parameters: [{}]" ,
166+ Strings .join (params .entrySet ()
167+ .stream ()
168+ .map (e -> e .getKey () + ": " + e .getValue ().toString ())
169+ .collect (Collectors .toList ()), ", " ));
153170 for (Entry <String , Object > e : params .entrySet ())
154171 q .setParameter (e .getKey (), e .getValue ());
172+ }
155173 return q ;
156174 }
157175
@@ -174,7 +192,7 @@ Query getCountQuery(final EntityManager em, final String selectClause, String jo
174192
175193 Query q = em .createQuery (String .format (query , this .type .getSimpleName ()));
176194
177- q = addAsyncStatesParamsToQuery (asyncStates , q );
195+ addAsyncStatesParamsToQuery (asyncStates , q );
178196 if (params != null )
179197 for (Entry <String , Object > e : params .entrySet ())
180198 q .setParameter (e .getKey (), e .getValue ());
@@ -269,53 +287,18 @@ private String buildWhereClause(final String whereClause, final Set<AsyncState>
269287 if (isSet (whereClause ) && !isSet (asyncStates ))
270288 r += whereClause ;
271289
272- if (!isSet (whereClause ) && isSet (asyncStates ))
273- r += addAsyncStatesToWhereClause (asyncStates );
274-
275- if (isSet (whereClause ) && isSet (asyncStates ))
276- r += "( " + whereClause + " ) AND ( " + addAsyncStatesToWhereClause (asyncStates ) + " )" ;
277-
278- return r ;
279- }
280-
281- private String addAsyncStatesToWhereClause (final Set <AsyncState > asyncStates ) {
282- StringBuilder sb = new StringBuilder ();
283- boolean isFirst = true ;
284-
285- for (int i = 0 ; i < asyncStates .size (); i ++) {
286- if (isFirst )
287- isFirst = false ;
288- else
289- sb .append (" OR " );
290- sb .append ("state = :state" );
291- sb .append (i );
290+ if (isSet (asyncStates )) {
291+ if (isSet (whereClause ))
292+ r += "( " + whereClause + " ) AND " ;
293+ r += "( o.state IN :asynchronous_state )" ;
292294 }
293295
294- return sb .toString ();
295- }
296-
297- private <T > TypedQuery <T > addAsyncStatesParamsToQuery (final Set <AsyncState > asyncStates ,
298- final TypedQuery <T > query ) {
299-
300- if (!isSet (asyncStates ))
301- return query ;
302-
303- int count = 0 ;
304- for (AsyncState state : asyncStates )
305- query .setParameter ("state" + count ++, state );
306-
307- return query ;
296+ return r ;
308297 }
309298
310- private Query addAsyncStatesParamsToQuery (final Set <AsyncState > asyncStates , final Query query ) {
311-
299+ private void addAsyncStatesParamsToQuery (final Set <AsyncState > asyncStates , final Query query ) {
312300 if (!isSet (asyncStates ))
313- return query ;
314-
315- int count = 0 ;
316- for (AsyncState state : asyncStates )
317- query .setParameter ("state" + count ++, state );
318-
319- return query ;
301+ return ;
302+ query .setParameter ("asynchronous_state" , asyncStates );
320303 }
321304}
0 commit comments