package Ġat . rech ner her z . example . domain . base Ċ Ċ import Ġat . rech ner her z . ao profiling . No Profiling Ċ import Ġorg . springframework . data . domain . Page Ċ import Ġorg . springframework . data . domain . Page able Ċ import Ġorg . springframework . data . domain . Sort Ċ import Ġorg . springframework . data . jpa . domain . Specification Ċ import Ġorg . springframework . data . repository . support . Repositories Ċ import Ġorg . springframework . data . rest . core . annotation . Repository Rest Resource Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġorg . springframework . web . context . Web ApplicationContext Ċ import Ġjava . util .* Ċ import Ġjavax . persistence . EntityManager Ċ import Ġjavax . persistence . met amodel . Attribute Ċ import Ġjavax . persistence . met amodel . EntityType Ċ import Ġjavax . persistence . met amodel . Pl ural Attribute Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Property 1 Ċ import Ġkotlin . reflect . full . find Annotation Ċ import Ġkotlin . reflect . full . instance Parameter Ċ import Ġkotlin . reflect . full . member Properties Ċ Ċ /** Ċ Ġ* ĠA Ġservice Ġthat Ġcan Ġdelegate Ġto Ġthe Ġright Ġrepository Ġfor Ġa Ġgiven Ġentity Ġtype . Ċ Ġ* Ċ Ġ* ĠAlso Ġprovides Ġmethods Ġto Ġaccess Ġthe Ġentity Ġmeta - model Ġwith Ġreflection . Ċ Ġ*/ Ċ @ Service Ċ @ No Profiling Ċ class ĠGeneric Repository Service ( ĊĠĠĠ Ġweb ApplicationContext : ĠWeb ApplicationContext , ĊĠĠĠ Ġval Ġentity Manager : ĠEntity Manager Ċ ) Ġ{ ĊĊĠĠĠ Ġval Ġrepositories : ĠRe positories Ġ= ĠRe positories ( web ApplicationContext ) ĊĊĠĠĠ Ġ/* -------------------------------- ---- *\ ĊĠĠĠĠ Ġ* ĠCRUD ĊĠĠĠ Ġ\ * -------------------------------- ---- */ ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > Ġsave ( entity : ĠT ): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( T :: class ). internal Save ( entity ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > Ġsave All ( entities : ĠIterable < T >): ĠIterable < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( T :: class ). internal Save All ( entities ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > ĠfindAll ( type : ĠK Class < T >): ĠIterable < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). internal Find All () ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > Ġfind ById ( type : ĠK Class < T >, Ġid : ĠLong ): ĠT ? Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). internal Find ById ( id ). orElse ( null ) ĊĊĠĠĠ Ġ/* -------------------------------- ---- *\ ĊĠĠĠĠ Ġ* ĠSpec ifications ĊĠĠĠ Ġ\ * -------------------------------- ---- */ ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > Ġfind One ( type : ĠK Class < T >, Ġspec : ĠSpecification < T >): ĠOptional < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). findOne ( spec ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > ĠfindAll ( type : ĠK Class < T >, Ġspec : ĠSpecification < T >): ĠIterable < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). findAll ( spec ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > ĠfindAll ( ĊĠĠĠĠĠĠĠ Ġtype : ĠK Class < T >, ĊĠĠĠĠĠĠĠ Ġspec : ĠSpecification < T >, ĊĠĠĠĠĠĠĠ Ġpage able : ĠPage able ĊĠĠĠ Ġ): ĠPage < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). findAll ( spec , Ġpage able ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > ĠfindAll ( ĊĠĠĠĠĠĠĠ Ġtype : ĠK Class < T >, ĊĠĠĠĠĠĠĠ Ġspec : ĠSpecification < T >, ĊĠĠĠĠĠĠĠ Ġsort : ĠSort ĊĠĠĠ Ġ): ĠIterable < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). findAll ( spec , Ġsort ) ĊĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠBase Entity > Ġcount ( type : ĠK Class < T >, Ġspec : ĠSpecification < T >): ĠLong Ġ= ĊĠĠĠĠĠĠĠ Ġrepository For EntityType ( type ). count ( spec ) ĊĊĠĠĠ Ġ/* -------------------------------- ---- *\ ĊĠĠĠĠ Ġ* ĠHelper ĠMethods ĊĠĠĠ Ġ\ * -------------------------------- ---- */ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠDet ach Ġan Ġentity Ġand Ġretrieve Ġit Ġfrom Ġthe Ġdatabase Ġby Ġid . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠUseful Ġin Ġ@ Before Save Ġevent Ġhandlers Ġto Ġobtain Ġthe Ġentity Ġstate Ġto Ġcompare Ġto Ġthe Ġevent Ġhandler Ġparameter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfinal Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠSimple Base Entity > Ġget Previous Entity State ( type : ĠK Class < T >, Ġentity : ĠT ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġentity Manager . detach ( entity ) ĊĠĠĠĠĠĠĠ Ġreturn Ġfind ById ( type , Ġentity . id !! ) !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturn Ġthe Ġrepository Ġfrom Ġ[ Repositories ] Ġfor Ġthe Ġgiven Ġentity Ġ[ type ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThrows Ġan Ġexception Ġif Ġ[ Repositories . getRepository For ] Ġreturns Ġnull Ġor Ġthe Ġrepository Ġis Ġnot Ġa Ġ[ Base Repository ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠBase Entity > Ġrepository For EntityType ( type : ĠK Class < T >): ĠBase Repository < T > Ġ= ĊĠĠĠĠĠĠĠ Ġrepositories . getRepository For ( type . java ). orElse ( null ) Ġas ? ĠBase Repository < T > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Could Ġnot Ġdetermine Ġrepository Ġfor Ġ$ type ") ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġproperty Ġaccessors Ġfor Ġall Ġembed d able Ġattributes Ġof Ġtype Ġ[ type ] Ġfor Ġall Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġall Embed d able Attributes OfType ( type : ĠK Class < T >): ĠList < K Property 1 < Base Entity , ĠT ? >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Manager . met amodel . entities . flatMap Ġ{ Ġentity Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġembed d able Attributes OfType ( entity Type , Ġtype ). map Ġ{ Ġattribute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Type . java Type . kotlin . member Properties . find Ġ{ Ġit . name Ġ== Ġattribute . name Ġ} Ġas ĠK Property 1 < Base Entity , ĠT ?> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġlist Ġof Ġproperty Ġaccessors Ġfor Ġall Ġelement Ġcollection Ġattributes Ġof Ġtype Ġ[ type ] Ġfor Ġall Ġentities . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġfun Ġ< T Ġ: ĠAny > Ġall Element Collection Attributes OfType ( type : ĠK Class < T >): ĠList < K Property 1 < Base Entity , ĠCollection < T >>> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Manager . met amodel . entities . flatMap Ġ{ Ġentity Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement Collection Attributes OfType ( entity Type , Ġtype ). map Ġ{ Ġattribute Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġentity Type . java Type . kotlin . member Properties . find Ġ{ Ġit . name Ġ== Ġattribute . name Ġ} Ġas ĠK Property 1 < Base Entity , ĠCollection < T >> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġmap Ġof Ġall Ġ[ EntityType ] s Ġto Ġ[ Repository Rest Resource ] Ġannotations Ġfor Ġall Ġrepositories . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Repository Rest Resources (): ĠMap < EntityType <* >, ĠRepository Rest Resource ?> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Manager . met amodel . entities . associate With Ġ{ Ġentity Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrepositories . getRepository For ( entity Type . bind able Java Type ). orElse ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . java Class ?. interfaces ?. first OrNull ()?. kotlin ?. find Annotation < Repository Rest Resource >() ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T Ġ: ĠAny > Ġembed d able Attributes OfType ( ĊĠĠĠĠĠĠĠ Ġentity Type : ĠEntityType < T >, ĊĠĠĠĠĠĠĠ Ġtype : ĠK Class < *> ĊĠĠĠ Ġ): ĠList < Attribute < in ĠT , Ġ* >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Type . attributes . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . persistent AttributeType Ġ== ĠAttribute . Persistent AttributeType . EMB ED DED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġit . java Type Ġ== Ġtype . java ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > Ġelement Collection Attributes OfType ( ĊĠĠĠĠĠĠĠ Ġentity Type : ĠEntityType < T >, ĊĠĠĠĠĠĠĠ Ġtype : ĠK Class < *> ĊĠĠĠ Ġ): ĠList < Attribute < in ĠT , Ġ* >> Ġ= ĊĠĠĠĠĠĠĠ Ġentity Type . attributes . filter Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit . persistent AttributeType Ġ== ĠAttribute . Persistent AttributeType . ELEMENT _ COLLECTION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ( it Ġas ? ĠPl ural Attribute < *, Ġ*, Ġ* >) ?. elementType ?. java Type Ġ== Ġtype . java ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T Ġ: ĠAny > ĠK Property 1 < T , Ġ* >. instance Class (): ĠK Class < T >? Ġ= ĊĠĠĠ Ġinstance Parameter ?. type ?. classifier Ġas ? ĠK Class < T > ĊĊ