/* Ċ Ġ* ĠCopyright Ġ 2 0 1 8 ĠCo up ang ĠLtd . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ Ċ @ file : Jvm Name (" Class Extensions ") Ċ Ċ package Ġorg . springframework . data . re query . kotlin Ċ Ċ import Ġio . re query . query . Named Expression Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . springframework . util . Linked Multi Value Map Ċ import Ġjava . lang . reflect . Annotated Element Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Method Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġjava . util .* Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ import Ġkotlin . reflect . K Class Ċ Ċ private Ġval Ġlog Ġ= ĠKotlin Logging . logger Ġ{} ĊĊ Ċ /** Ċ Ġ* Ġvar Ġë¡ľ ĠìĦł ìĸ¸ ëĲľ ĠíķĦ ëĵľ Ġì¤ĳ Ġnon Ġnull ĠìĪĺ íĺķ ìĹĲ ĠëĮĢ íķ´ Ġì ´Ī ê¸° íĻĶ Ġê°ĴìĿĦ Ġì§Ģìłķ íķĺê³ł ìŀĲ Ġíķł ĠëķĮ ĠìĤ¬ìļ© íķ©ëĭĪëĭ¤ . Ċ Ġ* ĠíĬ¹ íŀĪ Ġ``` @ Autowired ``` , Ġ``` @ Inject ``` Ġval ĠìĪĺ íĺķ ìĹĲ ĠìĤ¬ìļ© íķĺê¸° Ġì¢ĭ ëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ< pre > Ċ Ġ* ĠĠ Ġ< code > Ċ Ġ* ĠĠĠĠĠ Ġ@ Inject Ġval Ġx : ĠRepository Ġ= Ġun initialized () Ċ Ġ* ĠĠ Ġ</ code > Ċ Ġ* Ġ</ pre > Ċ Ġ* Ġ@ see Ġlateinit Ċ Ġ* Ġ@ see ĠDeleg ates . non Null Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< T > Ġun initialized (): ĠT Ġ= Ġnull Ġas ĠT Ċ Ċ fun Ġ< T > ĠT ?. as Optional (): ĠOptional < T > Ġ= ĠOptional . of Nullable ( this ) ĊĊ Ċ private Ġval Ġclass Field Cache Ġ= ĠConcurrent HashMap < String , ĠField ?> () Ċ private Ġval Ġclass Method Cache Ġ= ĠConcurrent HashMap < String , ĠMethod ?> () Ċ Ċ private Ġval Ġentity Field Cache Ġ= ĠLinked Multi Value Map < Class <* >, ĠField >() Ċ private Ġval Ġentity Method Cache Ġ= ĠLinked Multi Value Map < Class <* >, ĠMethod >() Ċ Ċ /** Ċ Ġ* ĠìĪĺ íĺķ ìĹĲ Ġì§Ģìłķ íķľ ĠíķĦ ëĵľ ëªħ ìĹĲ Ġíķ´ëĭ¹ íķĺëĬĶ Ġ[ Field ] ë¥¼ Ġì° ¾ ëĬĶ ëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param ĠfieldName Ġfield Ġname Ġto Ġfind Ċ Ġ*/ Ċ fun ĠClass <* >. find Field ( fieldName : ĠString ): ĠField ? Ġ{ ĊĊĠĠĠ Ġval Ġcache Key Ġ= Ġ"$ name .$ fieldName " ĊĊĠĠĠ Ġreturn Ġclass Field Cache . compute If Absent ( cacheKey ) Ġ{ Ġ_ Ġ-> ĊĊĠĠĠĠĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġthis @ find Field ĊĊĠĠĠĠĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Field Ġ= Ġtarget Class . getDeclared Field ( fieldName ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( found Field Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ compute If Absent Ġfound Field ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ Ġì¡° ê± ´ ìĹĲ Ġë§ ŀ ëĬĶ ĠField Ġëĵ¤ ìĿĦ Ġì° ¾ ìĬµëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param Ġpredicate Ġcondition Ġto Ġfind Ċ Ġ*/ Ċ fun ĠClass <* >. find Fields ( predicate : Ġ( Field ) Ġ-> ĠBoolean ): ĠSet < Field > Ġ{ ĊĊĠĠĠ Ġval Ġfound Fields Ġ= Ġmutable Set Of < Field >() ĊĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġthis ĊĊĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġtarget Class . declared Fields . filter Ġ{ Ġpredicate ( it ) Ġ}. toList () ĊĠĠĠĠĠĠĠ Ġfound Fields . addAll ( fields ) ĊĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfound Fields Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ Ġì¡° ê± ´ ìĹĲ Ġë§ ŀ ëĬĶ ĠField Ġì¤ĳ Ġì² « ë²Ī Ġì§ ¸ ĠField ë¥¼ Ġë°ĺíĻĺ íķľëĭ¤ Ċ Ġ* Ġ@ param Ġpredicate Ċ Ġ*/ Ċ fun ĠClass <* >. findFirst Field ( predicate : Ġ( Field ) Ġ-> ĠBoolean ): ĠField ? Ġ{ ĊĊĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġfind Re query Entity () ĊĊĠĠĠ Ġlog . trace Ġ{ Ġ" Target ĠRe query Ġentity Ġclass . Ġtarget Class =$ target Class " Ġ} ĊĊĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class Ġ/* target Class . is Re query Entity */) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġtarget Class . declared Fields . find Ġ{ Ġpredicate ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif ( field Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfield ĊĊĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ Ġë©Ķ ìĨĮ ëĵľ ëªħ ê³¼ ĠìĿ¸ ìŀĲ ë¥¼ Ġê°Ģì§Ģ ëĬĶ Ġ[ Method ] ë¥¼ Ġì° ¾ ìĬµëĭĪëĭ¤ . Ċ Ġ* Ċ Ġ* Ġ@ param ĠmethodName Ġmethod Ġname Ġto Ġfind Ċ Ġ* Ġ@ param Ġparam Types Ġtypes Ġof Ġmethod Ġparameters Ċ Ġ*/ Ċ fun ĠClass <* >. find Method ( methodName : ĠString , Ġvar arg Ġparam Types : ĠClass < *> ): ĠMethod ? Ġ{ ĊĠĠĠ Ġval Ġcache Key Ġ= Ġ"$ name .$ methodName .${ param Types . join ToString () }" ĊĊĠĠĠ Ġreturn Ġclass Method Cache . compute If Absent ( cacheKey ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġthis @ find Method ĊĊĠĠĠĠĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfound Method Ġ= Ġtarget Class . getMethod ( methodName , Ġ* param Types ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif ( found Method Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ compute If Absent Ġfound Method ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch ( e : ĠNoSuch Method Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNothing Ġto Ġdo . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ Ġì¡° ê± ´ ìĹĲ Ġë§ ŀ ëĬĶ Ġëª¨ëĵł Ġ[ Method ] ë¥¼ Ġì° ¾ ìĬµëĭĪëĭ¤ . Ċ Ġ* Ġ@ param Ġpredicate Ġconditions Ġto Ġfind Ċ Ġ*/ Ċ fun ĠClass <* >. find Methods ( predicate : Ġ( Method ) Ġ-> ĠBoolean ): ĠMutable Set < Method > Ġ{ ĊĊĠĠĠ Ġval Ġfound Methods Ġ= Ġmutable Set Of < Method >() ĊĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġthis ĊĊĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethods Ġ= Ġtarget Class . declared Methods ?. filter Ġ{ Ġpredicate ( it ) Ġ} ?. toList () ĊĠĠĠĠĠĠĠ Ġmethods ?. let Ġ{ Ġfound Methods . addAll ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġfound Methods Ċ } ĊĊ Ċ fun ĠClass <* >. findFirst Method ( predicate : Ġ( Method ) Ġ-> ĠBoolean ): ĠMethod ? Ġ{ ĊĊĠĠĠ Ġvar Ġtarget Class : ĠClass < *> ? Ġ= Ġfind Re query Entity () ĊĊĠĠĠ Ġwhile ( target Class Ġ!= Ġnull Ġ&& Ġ! target Class . is Any Class Ġ/* target Class . is Re query Entity */) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġtarget Class . declared Methods . find Ġ{ Ġpredicate ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġif ( method Ġ!= Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmethod ĊĊĠĠĠĠĠĠĠ Ġtarget Class Ġ= Ġtarget Class . super class ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ val ĠClass <* >. is Any Class : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġthis Ġ== ĠAny :: class . java Ġ|| Ġthis Ġ== ĠObject :: class . java Ċ Ċ val ĠClass <* >. is Re query Entity : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġdeclared Annotations . find Ġ{ Ġit . annotation Class Ġ== Ġio . re query . Entity :: class Ġ} Ġ!= Ġnull Ċ Ċ fun ĠClass <* >. find Re query Entity (): ĠClass < *> ? Ġ{ ĊĊĠĠĠ Ġval Ġentity Name Ġ= Ġthis . get Re query Entity Name () ĊĠĠĠ Ġval Ġfound Ġ= Ġinterfaces . find Ġ{ Ġit . name Ġ== Ġentity Name Ġ} ĊĠĠĠ Ġlog . trace Ġ{ Ġ" Find ĠRe query Ġentity Ġin Ġinterfaces . Ġtarget =$ this , Ġfound =$ found " Ġ} ĊĠĠĠ Ġif ( found Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfound ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġvar Ġcurrent : ĠClass < *> ? Ġ= Ġthis ĊĊĠĠĠ Ġwhile ( current Ġ!= Ġnull Ġ&& Ġ! current . is Any Class ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . trace Ġ{ Ġ" Find ĠRe query Ġentity . Ġcurrent =$ current " Ġ} ĊĠĠĠĠĠĠĠ Ġif ( current . is Re query Entity ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcurrent ĊĊĠĠĠĠĠĠĠ Ġcurrent Ġ= Ġcurrent . super class ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġnull Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠìĪĺ íĺķ ìĹĲìĦľ ĠRe query ìļ© ĠProperty ìĿĺ Ġ[ Field ] Ġìłķë³´ ëĵ¤ìĿĦ Ġê°Ģ ìł¸ ìĺ µ ëĭĪëĭ¤ . Ċ Ġ*/ Ċ fun ĠClass <* >. find Entity Fields (): ĠList < Field > Ġ{ ĊĠĠĠ Ġreturn Ġentity Field Cache . compute If Absent ( this ) Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠ Ġclazz . find Re query Entity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Fields ( Field :: is Re query Entity Field ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toList () ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List < Field >() ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠìĪĺ íĺķ ìĹĲìĦľ ĠRe query ìļ© ĠMethod Ġìłķë³´ ë¥¼ Ġì¶Ķ ì¶ľ íķ©ëĭĪëĭ¤ . Ċ Ġ*/ Ċ fun ĠClass <* >. find Entity Methods (): ĠList < Method > Ġ{ ĊĠĠĠ Ġreturn Ġentity Method Cache . compute If Absent ( this ) Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠ Ġclazz . find Re query Entity () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . find Methods ( Method :: is Re query Entity Method ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . toList () ĊĠĠĠĠĠĠĠ Ġ?: Ġempty List < Method >() ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠRe query ìļ© ĠField Ġì¤ĳ ìĹĲ Ġre query Ġprocessor ê°Ģ ĠìĥĿìĦ± íķľ ĠField ë¥¼ Ġìłľ ìĻ¸ íķľ Ġìĭ¤ ìłľ ĠìĹ Ķ íĭ° íĭ° ìĿĺ ĠíķĦ ëĵľ ìĿ¸ ì§Ģ Ġê²Ģ ìĤ¬ íķľëĭ¤ Ċ Ġ*/ Ċ fun ĠField . is Re query Entity Field (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ! this . is Re query Generated Field () Ċ } Ċ Ċ /** Ċ Ġ* ĠRe query ìļ© ĠMethod ì¤ĳ ìĹĲ Ġre query Ġprocessor ê°Ģ ĠìĥĿìĦ± íķľ ĠMethod ë¥¼ Ġìłľ ìĻ¸ íķľ Ġìĭ¤ ìłľ ĠìĹ Ķ íĭ° íĭ° ìĿĺ ĠíķĦ ëĵľ ìĿ¸ ì§Ģ Ġê²Ģ ìĤ¬ íķľëĭ¤ Ċ Ġ*/ Ċ fun ĠMethod . is Re query Entity Method (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ! this . is Re query Generated Method () Ġ&& Ġ! this . is Default Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠField ê°Ģ Ġre query - processor ë¡ľ ë¶Ģ íĦ° ĠìĥĿìĦ± ëĲľ Ġfield ĠìĿ¸ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠField . is Re query Generated Field (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( modifiers Ġand ĠModifier . STATIC ) Ġ> Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġ( name Ġ== Ġ"\ $ proxy ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġ( name . startsWith ("\ $ ") Ġ&& Ġname . endsWith ("_ state ")) Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠMethod ê°Ģ Ġre query - processor ë¡ľ ë¶Ģ íĦ° ĠìĥĿìĦ± ëĲľ Ġmethod ĠìĿ¸ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠMethod . is Re query Generated Method (): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġ( modifiers Ġand ĠModifier . STATIC ) Ġ> Ġ 0 Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġthis . is Var Args Ġ|| ĊĠĠĠĠĠĠĠĠĠĠ Ġthis . parameter Count Ġ> Ġ 0 Ċ } Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠíķĦ ëĵľ ëĤĺ Ġë©Ķ ìĨĮ ëĵľ ê°Ģ Ġre query ìĿĺ Ġ`@ Key ` Ġannotation ìĿ´ ĠìŀĪëĬĶ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠAnnot ated Element . is Key Anno ated Element (): ĠBoolean Ġ= Ġis Annotation Present ( io . re query . Key :: class . java ) Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠíķĦ ëĵľ ëĤĺ Ġë©Ķ ìĨĮ ëĵľ ê°Ģ ĠDB ìĹĲ ĠìłĢìŀ¥ íķł ĠíķĦìļĶ ĠìĹĨ ìĿĮ ìĿĦ ĠëĤĺ íĥĢ ëĤ´ ëĬĶ Ġre query ìĿĺ Ġ`@ Transient ` Ġannotation ìĿ´ ĠìŀĪëĬĶ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠAnnot ated Element . is Transient Annotated Element (): ĠBoolean Ġ= Ġis Annotation Present ( io . re query . Transient :: class . java ) Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠíķĦ ëĵľ ëĤĺ Ġë©Ķ ìĨĮ ëĵľ ê°Ģ Ġre query ìĿĺ Ġ`@ Embedded ` Ġannotation ìĿ´ ĠìŀĪëĬĶ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠAnnot ated Element . is Embedded Anno ated Element (): ĠBoolean Ġ= Ġis Annotation Present ( io . re query . Embedded :: class . java ) Ċ Ċ /** Ċ Ġ* Ġíķ´ëĭ¹ ĠíķĦ ëĵľ ëĤĺ Ġë©Ķ ìĨĮ ëĵľ ê°Ģ Ġentity ëĵ¤ ìĿĺ Ġassociation ìĿĦ ĠëĤĺ íĥĢ ëĤ´ ëĬĶ Ġre query ìĿĺ Ġannotation ìĿ´ ĠìŀĪëĬĶ ì§Ģ ĠìĹ¬ ë¶Ģ Ċ Ġ*/ Ċ fun ĠAnnot ated Element . is Associated Annotated Element (): ĠBoolean Ġ= ĊĠĠĠ Ġis Annotation Present ( io . re query . One ToOne :: class . java ) Ġ|| ĊĠĠĠ Ġis Annotation Present ( io . re query . OneToMany :: class . java ) Ġ|| ĊĠĠĠ Ġis Annotation Present ( io . re query . ManyToOne :: class . java ) Ġ|| ĊĠĠĠ Ġis Annotation Present ( io . re query . ManyToMany :: class . java ) Ċ Ċ /** Ċ Ġ* ĠìĹ Ķ íĭ° íĭ° ìĿĺ ĠíĬ¹ ìłķ ĠíķĦ ëĵľ ìĹĲ ĠëĮĢíķľ Ġ[ Named Expression ] ìĿĺ Ġì º Ĳ ìĭľ ë¥¼ Ġê´Ģë¦¬ íķ©ëĭĪëĭ¤ . Ċ Ġ*/ Ċ private Ġval Ġclass Key Expressions Ġ= ĠConcurrent HashMap < Class < out ĠAny >, ĠNamed Expression < out ĠAny >>() Ċ /** Ċ Ġ* ĠKey Ġ= ĠìĹ Ķ íĭ° íĭ° ìĿĺ Ġëªħ + íķ Ħ ëĵľ ëªħ , ĠValue =[ Named Expression ] ìĿĺ Ġì º Ĳ ìĭľ Ċ Ġ*/ Ċ private Ġval Ġclass Property Expressions Ġ= ĠConcurrent HashMap < String , ĠNamed Expression < out ĠAny > ?> () Ċ Ċ val ĠUNKNOWN _ KEY _ EXPRESSION : ĠNamed Expression < *> Ġ= ĠNamed Expression . of (" Unknown ", ĠAny :: class . java ) Ċ Ċ /** Ċ Ġ* ĠìĹ Ķ íĭ° íĭ° ìĹĲìĦľ Ġ`@ Key ` Ġannotation ìĿ´ Ġì§Ģìłķ ëĲ ł ĠìĨį ìĦ± / íķ Ħ ëĵľë¥¼ ĠìĿ´ìļ© íķĺëĬĶ Ġ[ Named Expression ] ìĿĦ ĠìĥĿìĦ± íķ©ëĭĪëĭ¤ . Ċ Ġ* Ġ@ param ĠV ĠìĨį ìĦ± / íķ Ħ ëĵľ ìĿĺ ĠìĪĺ íĺķ Ċ Ġ*/ Ċ fun Ġ< V Ġ: ĠAny > ĠK Class < out ĠAny >. getKey Expression (): ĠNamed Expression < V > Ġ= ĊĠĠĠ Ġthis . java . getKey Expression () Ċ Ċ /** Ċ Ġ* ĠìĹ Ķ íĭ° íĭ° ìĹĲìĦľ Ġ`@ Key ` Ġannotation ìĿ´ Ġì§Ģìłķ ëĲ ł ĠìĨį ìĦ± / íķ Ħ ëĵľë¥¼ ĠìĿ´ìļ© íķĺëĬĶ Ġ[ Named Expression ] ìĿĦ ĠìĥĿìĦ± íķ©ëĭĪëĭ¤ . Ċ Ġ* Ġ@ param ĠV ĠìĨį ìĦ± / íķ Ħ ëĵľ ìĿĺ ĠìĪĺ íĺķ Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun Ġ< V Ġ: ĠAny > ĠClass < out ĠAny >. getKey Expression (): ĠNamed Expression < V > Ġ{ ĊĊĠĠĠ Ġreturn Ġclass Key Expressions . compute If Absent ( this ) Ġ{ Ġdomain Class Ġ-> ĊĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠJava Ġentity ĠëĬ Ķ ĠField ë¡ľ Ġëĵ± ë¡Ŀ ëĲľ Ġid Ġê°ĴìĿĦ Ġë°ĺíĻĺ íķľëĭ¤ . ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠKotlin ìĿĺ Ġê²½ìļ° ëĬĶ ĠgetId () Ġë©Ķ ìĨĮ ëĵľ ë¡ľ ë¶Ģ íĦ° Ġë°ĺíĻĺ íķľëĭ¤ . ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġdomain Class . findFirst Field Ġ{ Ġit . getAnnotation ( io . re query . Key :: class . java ) Ġ!= Ġnull Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen ( field ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġdomain Class . findFirst Method Ġ{ Ġit . getAnnotation ( io . re query . Key :: class . java ) Ġ!= Ġnull Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen ( method ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug Ġ{ Ġ" Not Ġfound Ġ@ Key Ġproperty . Ġclass =${ this . simple Name } Ġ" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠUNKNOWN _ KEY _ EXPRESSION ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnamed Expression Of ( method . extract Getter Setter (), Ġmethod . returnType ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnamed Expression Of ( field . name , Ġfield . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġas ĠNamed Expression < V > Ċ } Ċ Ċ /** Ċ Ġ* ĠìĹ Ķ íĭ° íĭ° ìĹĲ ĠëĮĢ íķ´ Ġì§Ģìłķ íķľ ĠìĨį ìĦ± ëªħ ìľ¼ë¡ľ Ġ[ Named Expression ] ìĿĦ Ġë¹ Į ëĵľ íķ©ëĭĪëĭ¤ . Ċ Ġ* Ġ@ param ĠpropertyName Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ fun ĠClass < out ĠAny >. get Expression ( propertyName : ĠString ): ĠNamed Expression < *> ? Ġ{ ĊĊĠĠĠ Ġval Ġkey Ġ= Ġthis . name Ġ+ Ġ"." Ġ+ ĠpropertyName ĊĠĠĠ Ġreturn Ġclass Property Expressions . compute If Absent ( key ) Ġ{ Ġ_ Ġ-> ĊĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠJava Ġentity ĠëĬ Ķ ĠField ë¡ľ Ġëĵ± ë¡Ŀ ëĲľ Ġid Ġê°ĴìĿĦ Ġë°ĺíĻĺ íķľëĭ¤ . ĊĠĠĠĠĠĠĠ Ġ// ĠNOTE : ĠKotlin ìĿĺ Ġê²½ìļ° ëĬĶ ĠgetId () Ġë©Ķ ìĨĮ ëĵľ ë¡ľ ë¶Ģ íĦ° Ġë°ĺíĻĺ íķľëĭ¤ . ĊĠĠĠĠĠĠĠ Ġval Ġfield Ġ= Ġthis @ get Expression . findFirst Field Ġ{ Ġit . name Ġ== ĠpropertyName Ġ} ĊĠĠĠĠĠĠĠ Ġif ( field Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmethod Ġ= Ġthis . findFirst Method Ġ{ Ġit . extract Getter Setter () Ġ== ĠpropertyName Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmethod ?. let Ġ{ ĠNamed Expression . of ( method . extract Getter Setter (), Ġmethod . returnType ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNamed Expression . of ( field . name , Ġfield . type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* Ġì§Ģìłķ íķľ ĠìĹ Ķ íĭ° íĭ° ĠìĪĺ íĺķ ìľ¼ë¡ľ ë¶Ģ íĦ° Ġìĭ¤ ìłľ ĠìĹ Ķ íĭ° íĭ° Ġëªħ ìĿĦ Ġì¶Ķ ì¶ľ íķ©ëĭĪëĭ¤ . Ċ Ġ* ĠJava ìĹĲìĦľëĬĶ Ġ` Abstract ` Ġìłĳ ëĳĲ ìĤ¬ , ĠKotlin ìĹĲìĦľëĬĶ Ġ` Entity ` Ġìłĳ ë¯¸ ìĤ¬ ë¥¼ Ġìłľ ê±° íķĺê³ł Ġë°ĺíĻĺ íķ©ëĭĪëĭ¤ . Ċ Ġ*/ Ċ fun ĠClass <* >. get Re query Entity Name (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġsimple Name . contains (" Abstract ") Ġ-> Ġname . remove Prefix (" Abstract ") ĊĠĠĠĠĠĠĠ Ġsimple Name . contains (" Entity ") ĠĠ Ġ-> Ġname . remove Suffix (" Entity ") ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġsimple Name ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠKotlin ìľ¼ë¡ľ ĠìłķìĿĺ ëĲľ ĠEntity ìĿĺ Ġê²½ìļ° Ġ[ Method ] ë¡ľ ë¶Ģ íĦ° Ġfield Ġname ìĿĦ Ġì¶Ķ ì¶ľ íķ©ëĭĪëĭ¤ . Ġ( get / set Ġìłĳ ëĳĲ ìĤ¬ ë¥¼ Ġìłľ ê±° íķ©ëĭĪëĭ¤ ) Ċ Ġ*/ Ċ fun ĠMethod . extract Getter Setter (): ĠString Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠ Ġname . startsWith (" get ") Ġ-> Ġname . remove Prefix (" get "). de capitalize () ĊĠĠĠĠĠĠĠ Ġname . startsWith (" set ") Ġ-> Ġname . remove Prefix (" set "). de capitalize () ĊĠĠĠĠĠĠĠ Ġelse ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġname . de capitalize () ĊĠĠĠ Ġ} Ċ } Ċ