package Ġcom . way nest alk . jp ac ustom sql . employee Ċ Ċ import Ġcom . way nest alk . jp ac ustom sql . employ er . Employ er Ċ import Ġorg . springframework . data . domain . Page Ċ import Ġorg . springframework . data . domain . Page Impl Ċ import Ġorg . springframework . data . domain . Page able Ċ import Ġjavax . persistence . EntityManager Ċ import Ġjavax . persistence . Persistence Context Ċ Ċ class ĠEmployee Repository Custom Impl ( ĊĠĠĠ Ġ@ Persistence Context Ġprivate Ġval Ġentity Manager : ĠEntity Manager , Ċ ) Ġ: ĠEmployee Repository Custom Ġ{ ĊĠĠĠ Ġoverride Ġfun ĠfindAll ( name : ĠString ?, Ġpage able : ĠPage able ): ĠPage < Employee > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsb . append (" FROM ĠEmployee Ġe ") ĊĊĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġif Ġ(! name . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere . add (" e . name ĠLIKE ĠCONCAT ('% ', Ġ: name , Ġ'% ') ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [" name "] Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Query Ġ= Ġentity Manager . createQuery (" SELECT ĠCOUNT ( 1 ) Ġ$ sb ", ĠLong :: class . java ObjectType ) ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġcount Query . setParameter ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount Query . single Result ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! page able . sort . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorts Ġ= Ġpage able . sort . map Ġ{ Ġ" e .${ it . property } Ġ${ if Ġ( it . is Ascending ) Ġ" ASC " Ġelse Ġ" DESC "} " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ĠORDER ĠBY Ġ${ sort s . join ToString (", Ġ" )} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist Query Ġ= Ġentity Manager . createQuery (" SELECT Ġe ĠAS Ġemployee Ġ$ sb ") ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġlist Query . setParameter ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġlist Query . max Results Ġ= Ġpage able . pageSize ĊĠĠĠĠĠĠĠ Ġlist Query . first Result Ġ= Ġpage able . offset . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Query . result List . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġit Ġas ĠEmployee ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPage Impl ( list , Ġpage able , Ġcount ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠfindAll Detailed ( name : ĠString ?, Ġpage able : ĠPage able ): ĠPage < Pair < Employee , ĠEmploy er >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsb Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġsb . append (" FROM ĠEmployee Ġe ") ĊĠĠĠĠĠĠĠ Ġsb . append (" ĠLEFT ĠJOIN ĠEmploy er Ġer ĠON Ġer . employ er Id Ġ= Ġe . employ er Id ") ĊĊĠĠĠĠĠĠĠ Ġval Ġwhere Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġval Ġparameters Ġ= Ġmutable Map Of < String , ĠAny >() ĊĠĠĠĠĠĠĠ Ġif Ġ(! name . isNull Or Blank ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhere . add (" e . name ĠLIKE ĠCONCAT ('% ', Ġ: name , Ġ'% ') ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameters [" name "] Ġ= Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcount Query Ġ= Ġentity Manager . createQuery (" SELECT ĠCOUNT ( 1 ) Ġ$ sb ", ĠLong :: class . java ObjectType ) ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġcount Query . setParameter ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġcount Query . single Result ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! page able . sort . isEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsorts Ġ= Ġpage able . sort . map Ġ{ Ġ" e .${ it . property } Ġ${ if Ġ( it . is Ascending ) Ġ" ASC " Ġelse Ġ" DESC "} " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsb . append (" ĠORDER ĠBY Ġ${ sort s . join ToString (", Ġ" )} ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlist Query Ġ= Ġentity Manager . createQuery (" SELECT Ġe ĠAS Ġemployee , Ġer ĠAS Ġemploy er Ġ$ sb ") ĊĠĠĠĠĠĠĠ Ġparameters . forEach Ġ{ Ġlist Query . setParameter ( it . key , Ġit . value ) Ġ} ĊĠĠĠĠĠĠĠ Ġlist Query . max Results Ġ= Ġpage able . pageSize ĊĠĠĠĠĠĠĠ Ġlist Query . first Result Ġ= Ġpage able . offset . toInt () ĊĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlist Query . result List . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarray Ġ= Ġit Ġas ĠArray < *> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map ĠPair ( array [ 0 ] Ġas ĠEmployee , Ġarray [ 1 ] Ġas ĠEmploy er ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPage Impl ( list , Ġpage able , Ġcount ) ĊĠĠĠ Ġ} Ċ }