diff --git a/search-index.json b/search-index.json
index c99725f9b..2144863a0 100644
--- a/search-index.json
+++ b/search-index.json
@@ -1 +1 @@
-[{"documents":[{"i":1,"t":"","u":"/jimmer-doc/blog/authors","b":[]},{"i":2,"t":"First Blog Post","u":"/jimmer-doc/blog/first-blog-post","b":[]},{"i":4,"t":"Long Blog Post","u":"/jimmer-doc/blog/long-blog-post","b":[]},{"i":6,"t":"MDX Blog Post","u":"/jimmer-doc/blog/mdx-blog-post","b":[]},{"i":8,"t":"Welcome","u":"/jimmer-doc/blog/welcome","b":[]},{"i":10,"t":"Cache type","u":"/jimmer-doc/docs/cache/cache-type/","b":["View more","Cache","Cache type"]},{"i":12,"t":"Cache","u":"/jimmer-doc/docs/cache/","b":["View more","Cache"]},{"i":14,"t":"Object Cache","u":"/jimmer-doc/docs/cache/cache-type/object","b":["View more","Cache","Cache type"]},{"i":26,"t":"Cache Consistency","u":"/jimmer-doc/docs/cache/consistency","b":["View more","Cache"]},{"i":32,"t":"Calculated Cache","u":"/jimmer-doc/docs/cache/cache-type/calculation","b":["View more","Cache","Cache type"]},{"i":47,"t":"Multi-view Cache","u":"/jimmer-doc/docs/cache/multiview-cache/","b":["View more","Cache","Multi-view Cache"]},{"i":49,"t":"Cache Abandoned Reason","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","b":["View more","Cache","Multi-view Cache"]},{"i":56,"t":"Advanced usage","u":"/jimmer-doc/docs/cache/multiview-cache/advanced","b":["View more","Cache","Multi-view Cache"]},{"i":57,"t":"Association Cache","u":"/jimmer-doc/docs/cache/cache-type/association","b":["View more","Cache","Cache type"]},{"i":77,"t":"Basic Concepts","u":"/jimmer-doc/docs/cache/multiview-cache/concept","b":["View more","Cache","Multi-view Cache"]},{"i":88,"t":"Client","u":"/jimmer-doc/docs/client/","b":["View more","Client"]},{"i":89,"t":"User Defined Cacheable Filters","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","b":["View more","Cache","Multi-view Cache"]},{"i":110,"t":"Enable Cache","u":"/jimmer-doc/docs/cache/enable-cache","b":["View more","Cache"]},{"i":123,"t":"Configuration","u":"/jimmer-doc/docs/configuration/","b":["View more","Configuration"]},{"i":125,"t":"Batch Control","u":"/jimmer-doc/docs/configuration/batch-size","b":["View more","Configuration"]},{"i":131,"t":"Generate Client API","u":"/jimmer-doc/docs/client/api","b":["View more","Client"]},{"i":149,"t":"Cache Abandoned Reason","u":"/jimmer-doc/docs/configuration/cache-abandoned","b":["View more","Configuration"]},{"i":151,"t":"Database Validation","u":"/jimmer-doc/docs/configuration/database-validation","b":["View more","Configuration"]},{"i":160,"t":"Default Naming Strategy","u":"/jimmer-doc/docs/configuration/default-database-stragegy","b":["View more","Configuration"]},{"i":162,"t":"Default Enum Strategy","u":"/jimmer-doc/docs/configuration/default-enum-strategy","b":["View more","Configuration"]},{"i":164,"t":"Dialect","u":"/jimmer-doc/docs/configuration/dialect","b":["View more","Configuration"]},{"i":170,"t":"Connection Manager","u":"/jimmer-doc/docs/configuration/connection-manager","b":["View more","Configuration"]},{"i":177,"t":"Associated Id Checking","u":"/jimmer-doc/docs/configuration/id-only-target-checking-level","b":["View more","Configuration"]},{"i":179,"t":"Default Dissociation Mode","u":"/jimmer-doc/docs/configuration/dissociate-action-checking","b":["View more","Configuration"]},{"i":181,"t":"In List Predicate Optimization","u":"/jimmer-doc/docs/configuration/in-list-optimization","b":["View more","Configuration"]},{"i":187,"t":"Microservice","u":"/jimmer-doc/docs/configuration/micro-service","b":["View more","Configuration"]},{"i":189,"t":"Pessimistic Lock","u":"/jimmer-doc/docs/configuration/save-command-pessimistic-lock","b":["View more","Configuration"]},{"i":191,"t":"Generate Client Errors","u":"/jimmer-doc/docs/client/error","b":["View more","Client"]},{"i":214,"t":"Multiple DataSources","u":"/jimmer-doc/docs/configuration/multi-datasources","b":["View more","Configuration"]},{"i":220,"t":"Trigger Type","u":"/jimmer-doc/docs/configuration/trigger-type","b":["View more","Configuration"]},{"i":222,"t":"SQL Log","u":"/jimmer-doc/docs/configuration/sql-log","b":["View more","Configuration"]},{"i":232,"t":"GraphQL","u":"/jimmer-doc/docs/graphql/","b":["View more","GraphQL"]},{"i":234,"t":"Basic Concepts","u":"/jimmer-doc/docs/graphql/concept","b":["View more","GraphQL"]},{"i":239,"t":"Scalar Provider","u":"/jimmer-doc/docs/configuration/scala-provider","b":["View more","Configuration"]},{"i":254,"t":"Mapping","u":"/jimmer-doc/docs/mapping/","b":["View more","Mapping"]},{"i":256,"t":"Advanced mapping","u":"/jimmer-doc/docs/mapping/advanced/","b":["View more","Mapping","Advanced mapping"]},{"i":258,"t":"Calculated Properties","u":"/jimmer-doc/docs/mapping/advanced/calculated/","b":["View more","Mapping","Advanced mapping","Calculated Properties"]},{"i":260,"t":"Mutation","u":"/jimmer-doc/docs/graphql/mutation","b":["View more","GraphQL"]},{"i":267,"t":"","u":"/jimmer-doc/blog/archive","b":[]},{"i":268,"t":"Query","u":"/jimmer-doc/docs/graphql/query","b":["View more","GraphQL"]},{"i":278,"t":"Enum Mapping","u":"/jimmer-doc/docs/mapping/advanced/enum","b":["View more","Mapping","Advanced mapping"]},{"i":288,"t":"Non-Structural Mapping","u":"/jimmer-doc/docs/mapping/advanced/join-sql","b":["View more","Mapping","Advanced mapping"]},{"i":295,"t":"Formula","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","b":["View more","Mapping","Advanced mapping","Calculated Properties"]},{"i":308,"t":"JSON Mapping","u":"/jimmer-doc/docs/mapping/advanced/json","b":["View more","Mapping","Advanced mapping"]},{"i":319,"t":"Embedded Properties","u":"/jimmer-doc/docs/mapping/advanced/embedded","b":["View more","Mapping","Advanced mapping"]},{"i":334,"t":"Logical Deletion","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/","b":["View more","Mapping","Advanced mapping","Logical Deletion"]},{"i":336,"t":"Key","u":"/jimmer-doc/docs/mapping/advanced/key","b":["View more","Mapping","Advanced mapping"]},{"i":343,"t":"Entity Table","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/entity","b":["View more","Mapping","Advanced mapping","Logical Deletion"]},{"i":351,"t":"MappedSuperclass","u":"/jimmer-doc/docs/mapping/advanced/mapped-super-class","b":["View more","Mapping","Advanced mapping"]},{"i":356,"t":"OnDissociate","u":"/jimmer-doc/docs/mapping/advanced/on-dissociate","b":["View more","Mapping","Advanced mapping"]},{"i":363,"t":"Remote Association","u":"/jimmer-doc/docs/mapping/advanced/remote","b":["View more","Mapping","Advanced mapping"]},{"i":369,"t":"View Properties","u":"/jimmer-doc/docs/mapping/advanced/view/","b":["View more","Mapping","Advanced mapping","View Properties"]},{"i":371,"t":"Join Table","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/join-table","b":["View more","Mapping","Advanced mapping","Logical Deletion"]},{"i":377,"t":"ManyToManyView","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","b":["View more","Mapping","Advanced mapping","View Properties"]},{"i":394,"t":"Base mapping","u":"/jimmer-doc/docs/mapping/base/","b":["View more","Mapping","Base mapping"]},{"i":396,"t":"Association Mapping","u":"/jimmer-doc/docs/mapping/base/association/","b":["View more","Mapping","Base mapping","Association Mapping"]},{"i":398,"t":"Many To Many","u":"/jimmer-doc/docs/mapping/base/association/many-to-many","b":["View more","Mapping","Base mapping","Association Mapping"]},{"i":406,"t":"Many To One","u":"/jimmer-doc/docs/mapping/base/association/many-to-one","b":["View more","Mapping","Base mapping","Association Mapping"]},{"i":412,"t":"One To Many","u":"/jimmer-doc/docs/mapping/base/association/one-to-many","b":["View more","Mapping","Base mapping","Association Mapping"]},{"i":414,"t":"One To One","u":"/jimmer-doc/docs/mapping/base/association/one-to-one","b":["View more","Mapping","Base mapping","Association Mapping"]},{"i":424,"t":"IdView","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","b":["View more","Mapping","Advanced mapping","View Properties"]},{"i":440,"t":"Simple Mapping","u":"/jimmer-doc/docs/mapping/base/basic","b":["View more","Mapping","Base mapping"]},{"i":459,"t":"Join Table Filter","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","b":["View more","Mapping","Advanced mapping"]},{"i":472,"t":"Real and Fake Foreign Keys","u":"/jimmer-doc/docs/mapping/base/foreignkey","b":["View more","Mapping","Base mapping"]},{"i":480,"t":"Naming Strategy","u":"/jimmer-doc/docs/mapping/base/naming-strategy","b":["View more","Mapping","Base mapping"]},{"i":495,"t":"More Types","u":"/jimmer-doc/docs/mapping/base/more-type","b":["View more","Mapping","Base mapping"]},{"i":503,"t":"Nullity","u":"/jimmer-doc/docs/mapping/base/nullity","b":["View more","Mapping","Base mapping"]},{"i":514,"t":"Modification","u":"/jimmer-doc/docs/mutation/","b":["View more","Modification"]},{"i":516,"t":"Delete Command","u":"/jimmer-doc/docs/mutation/delete-command","b":["View more","Modification"]},{"i":529,"t":"JSON Converter","u":"/jimmer-doc/docs/mapping/base/json-converter","b":["View more","Mapping","Base mapping"]},{"i":544,"t":"Delete Statement","u":"/jimmer-doc/docs/mutation/delete-statement","b":["View more","Modification"]},{"i":549,"t":"Save Command","u":"/jimmer-doc/docs/mutation/save-command/","b":["View more","Modification","Save Command"]},{"i":551,"t":"Interceptor before save","u":"/jimmer-doc/docs/mutation/draft-interceptor","b":["View more","Modification"]},{"i":567,"t":"Associations","u":"/jimmer-doc/docs/mutation/save-command/association/","b":["View more","Modification","Save Command","Associations"]},{"i":568,"t":"Mutable Association Table","u":"/jimmer-doc/docs/mutation/associations","b":["View more","Modification"]},{"i":585,"t":"Save Mode of Associated Objects","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","b":["View more","Modification","Save Command"]},{"i":598,"t":"Association classification","u":"/jimmer-doc/docs/mutation/save-command/association/classification","b":["View more","Modification","Save Command","Associations"]},{"i":613,"t":"Owner side","u":"/jimmer-doc/docs/mutation/save-command/association/owner","b":["View more","Modification","Save Command","Associations"]},{"i":623,"t":"Associated Id Checking","u":"/jimmer-doc/docs/mutation/save-command/id-checking","b":["View more","Modification","Save Command"]},{"i":637,"t":"Incomplete Object","u":"/jimmer-doc/docs/mutation/save-command/incomplete","b":["View more","Modification","Save Command"]},{"i":643,"t":"Data Classification","u":"/jimmer-doc/docs/mutation/save-command/data-classification","b":["View more","Modification","Save Command"]},{"i":657,"t":"Input DTO","u":"/jimmer-doc/docs/mutation/save-command/input-dto/","b":["View more","Modification","Save Command","Input DTO"]},{"i":659,"t":"Lonely Form","u":"/jimmer-doc/docs/mutation/save-command/input-dto/lonely","b":["View more","Modification","Save Command","Input DTO"]},{"i":661,"t":"Dissociation Operations","u":"/jimmer-doc/docs/mutation/save-command/dissociation","b":["View more","Modification","Save Command"]},{"i":673,"t":"Using MapStruct","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","b":["View more","Modification","Save Command","Input DTO"]},{"i":685,"t":"Using DTO Language","u":"/jimmer-doc/docs/mutation/save-command/input-dto/dto-lang","b":["View more","Modification","Save Command","Input DTO"]},{"i":695,"t":"Problem","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","b":["View more","Modification","Save Command","Input DTO"]},{"i":707,"t":"Other Features","u":"/jimmer-doc/docs/mutation/save-command/other","b":["View more","Modification","Save Command"]},{"i":710,"t":"Optimistic/Pessimistic Lock","u":"/jimmer-doc/docs/mutation/save-command/lock","b":["View more","Modification","Save Command"]},{"i":724,"t":"Handle Null Values","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","b":["View more","Modification","Save Command","Input DTO"]},{"i":745,"t":"Save Mode of Aggregate-Root","u":"/jimmer-doc/docs/mutation/save-command/save-mode","b":["View more","Modification","Save Command"]},{"i":776,"t":"Update Statement","u":"/jimmer-doc/docs/mutation/update-statement","b":["View more","Modification"]},{"i":785,"t":"Basic Usage","u":"/jimmer-doc/docs/mutation/save-command/usage","b":["View more","Modification","Save Command"]},{"i":796,"t":"Complex Calculation","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","b":["View more","Mapping","Advanced mapping","Calculated Properties"]},{"i":820,"t":"Object","u":"/jimmer-doc/docs/object/","b":["View more","Object"]},{"i":822,"t":"Immutability","u":"/jimmer-doc/docs/object/immutable/","b":["View more","Object","Immutability"]},{"i":824,"t":"Current Situation","u":"/jimmer-doc/docs/object/immutable/current-situation","b":["View more","Object","Immutability"]},{"i":826,"t":"Reason","u":"/jimmer-doc/docs/object/immutable/reason","b":["View more","Object","Immutability"]},{"i":835,"t":"Dynamicity","u":"/jimmer-doc/docs/object/dynamic","b":["View more","Object"]},{"i":856,"t":"Solution","u":"/jimmer-doc/docs/object/immutable/solution","b":["View more","Object","Immutability"]},{"i":864,"t":"DTO conversion","u":"/jimmer-doc/docs/object/view/","b":["View more","Object","DTO conversion"]},{"i":866,"t":"Trigger","u":"/jimmer-doc/docs/mutation/trigger","b":["View more","Modification"]},{"i":894,"t":"Tool Methods","u":"/jimmer-doc/docs/object/tool","b":["View more","Object"]},{"i":922,"t":"Visibility","u":"/jimmer-doc/docs/object/visibility","b":["View more","Object"]},{"i":930,"t":"Working with Jackson","u":"/jimmer-doc/docs/object/jackson","b":["View more","Object"]},{"i":932,"t":"Introduction ★","u":"/jimmer-doc/docs/overview/","b":["View more","Introduction ★"]},{"i":934,"t":"APT/KSP","u":"/jimmer-doc/docs/overview/apt-ksp","b":["View more","Introduction ★"]},{"i":947,"t":"MapStruct","u":"/jimmer-doc/docs/object/view/mapstruct","b":["View more","Object","DTO conversion"]},{"i":970,"t":"Benchmark Report","u":"/jimmer-doc/docs/overview/benchmark","b":["View more","Introduction ★"]},{"i":983,"t":"DTO Language","u":"/jimmer-doc/docs/object/view/dto-language","b":["View more","Object","DTO conversion"]},{"i":1059,"t":"Before Reading","u":"/jimmer-doc/docs/overview/welcome","b":["View more","Introduction ★"]},{"i":1066,"t":"Key Features ✦","u":"/jimmer-doc/docs/overview/key-features","b":["View more","Introduction ★"]},{"i":1074,"t":"Query","u":"/jimmer-doc/docs/query/","b":["View more","Query"]},{"i":1076,"t":"Dynamic JOIN","u":"/jimmer-doc/docs/query/dynamic-join/","b":["View more","Query","Dynamic JOIN"]},{"i":1078,"t":"Association Path Chaining","u":"/jimmer-doc/docs/query/dynamic-join/chain-style","b":["View more","Query","Dynamic JOIN"]},{"i":1084,"t":"Draft","u":"/jimmer-doc/docs/object/draft","b":["View more","Object"]},{"i":1113,"t":"Join Features Specific to Kotlin","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","b":["View more","Query","Dynamic JOIN"]},{"i":1124,"t":"Merge Conflict Joins","u":"/jimmer-doc/docs/query/dynamic-join/merge","b":["View more","Query","Dynamic JOIN"]},{"i":1129,"t":"Problems with Other Solutions","u":"/jimmer-doc/docs/query/dynamic-join/problem","b":["View more","Query","Dynamic JOIN"]},{"i":1135,"t":"Querying Association Tables","u":"/jimmer-doc/docs/query/associations","b":["View more","Query"]},{"i":1146,"t":"Overview ✦","u":"/jimmer-doc/docs/overview/introduction","b":["View more","Introduction ★"]},{"i":1180,"t":"Dynamic Ordering","u":"/jimmer-doc/docs/query/dynamic-order","b":["View more","Query"]},{"i":1190,"t":"Dynamic Filtering","u":"/jimmer-doc/docs/query/dynamic-where","b":["View more","Query"]},{"i":1197,"t":"Weak Join","u":"/jimmer-doc/docs/query/dynamic-join/weak-join","b":["View more","Query","Dynamic JOIN"]},{"i":1205,"t":"Global Filters","u":"/jimmer-doc/docs/query/global-filter/","b":["View more","Query","Global Filters"]},{"i":1207,"t":"Logical Deletion","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","b":["View more","Query","Global Filters"]},{"i":1220,"t":"Pagination Safety","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","b":["View more","Query","Dynamic JOIN"]},{"i":1240,"t":"Aggregate & Group","u":"/jimmer-doc/docs/query/group","b":["View more","Query"]},{"i":1245,"t":"Custom Filters","u":"/jimmer-doc/docs/query/global-filter/user-filter","b":["View more","Query","Global Filters"]},{"i":1270,"t":"Implicit Subquery","u":"/jimmer-doc/docs/query/implicit-subquery","b":["View more","Query"]},{"i":1278,"t":"Native SQL Expressions","u":"/jimmer-doc/docs/query/native-sql","b":["View more","Query"]},{"i":1284,"t":"Object Fetcher","u":"/jimmer-doc/docs/query/object-fetcher/","b":["View more","Query","Object Fetcher"]},{"i":1289,"t":"Querying DTOs","u":"/jimmer-doc/docs/query/object-fetcher/dto","b":["View more","Query","Object Fetcher"]},{"i":1300,"t":"Optimize Unnecessary Joins","u":"/jimmer-doc/docs/query/dynamic-join/optimization","b":["View more","Query","Dynamic JOIN"]},{"i":1321,"t":"Working with Spring Data","u":"/jimmer-doc/docs/query/object-fetcher/spring-data","b":["View more","Query","Object Fetcher"]},{"i":1323,"t":"Ordinary Properties","u":"/jimmer-doc/docs/query/object-fetcher/props","b":["View more","Query","Object Fetcher"]},{"i":1332,"t":"Basic Usage","u":"/jimmer-doc/docs/query/object-fetcher/usage","b":["View more","Query","Object Fetcher"]},{"i":1339,"t":"Smart Paging","u":"/jimmer-doc/docs/query/paging/","b":["View more","Query","Smart Paging"]},{"i":1341,"t":"Deep Pagination Optimization","u":"/jimmer-doc/docs/query/paging/deep-optimization","b":["View more","Query","Smart Paging"]},{"i":1349,"t":"View Properties","u":"/jimmer-doc/docs/query/object-fetcher/view","b":["View more","Query","Object Fetcher"]},{"i":1364,"t":"DSL Expressions","u":"/jimmer-doc/docs/query/expression","b":["View more","Query"]},{"i":1408,"t":"Associations","u":"/jimmer-doc/docs/query/object-fetcher/association","b":["View more","Query","Object Fetcher"]},{"i":1431,"t":"Table Join Optimization","u":"/jimmer-doc/docs/query/paging/unnecessary-join","b":["View more","Query","Smart Paging"]},{"i":1439,"t":"Reverse Sorting Optimization","u":"/jimmer-doc/docs/query/paging/reverse-sorting","b":["View more","Query","Smart Paging"]},{"i":1448,"t":"Subqueries","u":"/jimmer-doc/docs/query/sub-query","b":["View more","Query"]},{"i":1466,"t":"Overview","u":"/jimmer-doc/docs/query/usage","b":["View more","Query"]},{"i":1471,"t":"Super QBE","u":"/jimmer-doc/docs/query/super_qbe","b":["View more","Query"]},{"i":1501,"t":"3. Arbitrary Dynamic Query","u":"/jimmer-doc/docs/quick-view/dsl/","b":["View more","Quick View ★","3. Arbitrary Dynamic Query"]},{"i":1503,"t":"Quick View ★","u":"/jimmer-doc/docs/quick-view/","b":["View more","Quick View ★"]},{"i":1505,"t":"1. Query Arbitrary Shape","u":"/jimmer-doc/docs/quick-view/fetch/","b":["View more","Quick View ★","1. Query Arbitrary Shape"]},{"i":1510,"t":"Usage","u":"/jimmer-doc/docs/query/paging/usage","b":["View more","Query","Smart Paging"]},{"i":1532,"t":"Exposing Features","u":"/jimmer-doc/docs/quick-view/fetch/export/","b":["View more","Quick View ★","1. Query Arbitrary Shape","Exposing Features"]},{"i":1534,"t":"Super QBE","u":"/jimmer-doc/docs/quick-view/dsl/super_qbe","b":["View more","Quick View ★","3. Arbitrary Dynamic Query"]},{"i":1543,"t":"Recursive Query","u":"/jimmer-doc/docs/query/object-fetcher/recursive","b":["View more","Query","Object Fetcher"]},{"i":1555,"t":"Comparison","u":"/jimmer-doc/docs/quick-view/fetch/export/comparison","b":["View more","Quick View ★","1. Query Arbitrary Shape","Exposing Features"]},{"i":1557,"t":"Get Started","u":"/jimmer-doc/docs/quick-view/get-started/","b":["View more","Quick View ★","Get Started"]},{"i":1559,"t":"Directly Return Entities","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","b":["View more","Quick View ★","1. Query Arbitrary Shape","Exposing Features"]},{"i":1572,"t":"Feature Introduction","u":"/jimmer-doc/docs/quick-view/dsl/feature","b":["View more","Quick View ★","3. Arbitrary Dynamic Query"]},{"i":1591,"t":"Create Database","u":"/jimmer-doc/docs/quick-view/get-started/create-database","b":["View more","Quick View ★","Get Started"]},{"i":1597,"t":"Create a Project","u":"/jimmer-doc/docs/quick-view/get-started/create-project","b":["View more","Quick View ★","Get Started"]},{"i":1608,"t":"Generate Code","u":"/jimmer-doc/docs/quick-view/get-started/generate-code","b":["View more","Quick View ★","Get Started"]},{"i":1613,"t":"Final Usage","u":"/jimmer-doc/docs/quick-view/get-started/usage","b":["View more","Quick View ★","Get Started"]},{"i":1626,"t":"Return Output DTO","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","b":["View more","Quick View ★","1. Query Arbitrary Shape","Exposing Features"]},{"i":1652,"t":"Feature Introduction","u":"/jimmer-doc/docs/quick-view/fetch/feature","b":["View more","Quick View ★","1. Query Arbitrary Shape"]},{"i":1668,"t":"Exposing Features","u":"/jimmer-doc/docs/quick-view/save/export/","b":["View more","Quick View ★","2. Save Arbitrary Shape","Exposing Features"]},{"i":1670,"t":"Precondition","u":"/jimmer-doc/docs/quick-view/precondition","b":["View more","Quick View ★"]},{"i":1683,"t":"2. Save Arbitrary Shape","u":"/jimmer-doc/docs/quick-view/save/","b":["View more","Quick View ★","2. Save Arbitrary Shape"]},{"i":1685,"t":"Save Long Associations","u":"/jimmer-doc/docs/quick-view/save/export/long","b":["View more","Quick View ★","2. Save Arbitrary Shape","Exposing Features"]},{"i":1694,"t":"Feature Introduction","u":"/jimmer-doc/docs/quick-view/save/feature","b":["View more","Quick View ★","2. Save Arbitrary Shape"]},{"i":1705,"t":"Save Short Associations","u":"/jimmer-doc/docs/quick-view/save/export/short","b":["View more","Quick View ★","2. Save Arbitrary Shape","Exposing Features"]},{"i":1716,"t":"Define Entities","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","b":["View more","Quick View ★","Get Started"]},{"i":1732,"t":"Resources","u":"/jimmer-doc/docs/resource/","b":["View more","Resources"]},{"i":1733,"t":"Discuss","u":"/jimmer-doc/docs/resource/discuss","b":["View more","Resources"]},{"i":1735,"t":"Save Aggregate Root","u":"/jimmer-doc/docs/quick-view/save/export/root","b":["View more","Quick View ★","2. Save Arbitrary Shape","Exposing Features"]},{"i":1754,"t":"Video","u":"/jimmer-doc/docs/resource/video","b":["View more","Resources"]},{"i":1756,"t":"Ecosystem","u":"/jimmer-doc/docs/resource/ecosystem","b":["View more","Resources"]},{"i":1768,"t":"Standard Examples","u":"/jimmer-doc/docs/quick-view/standard-demo","b":["View more","Quick View ★"]},{"i":1784,"t":"1. Basic Query","u":"/jimmer-doc/docs/showcase/base","b":["View more","Showcase ★"]},{"i":1792,"t":"10. Delete statement","u":"/jimmer-doc/docs/showcase/delete-statement","b":["View more","Showcase ★"]},{"i":1793,"t":"Showcase ★","u":"/jimmer-doc/docs/showcase/","b":["View more","Showcase ★"]},{"i":1794,"t":"2. Fetch Associations","u":"/jimmer-doc/docs/showcase/fetch-association/","b":["View more","Showcase ★","2. Fetch Associations"]},{"i":1795,"t":"2.3 Deeper Association","u":"/jimmer-doc/docs/showcase/fetch-association/deeper-association","b":["View more","Showcase ★","2. Fetch Associations"]},{"i":1800,"t":"2.1 Associated Object","u":"/jimmer-doc/docs/showcase/fetch-association/associated-object","b":["View more","Showcase ★","2. Fetch Associations"]},{"i":1805,"t":"2.4 Associated Id","u":"/jimmer-doc/docs/showcase/fetch-association/associated-id","b":["View more","Showcase ★","2. Fetch Associations"]},{"i":1814,"t":"5.2 Dynamic Sorting","u":"/jimmer-doc/docs/showcase/order-by/dynamic","b":["View more","Showcase ★","5. Sorting"]},{"i":1824,"t":"5. Sorting","u":"/jimmer-doc/docs/showcase/order-by/","b":["View more","Showcase ★","5. Sorting"]},{"i":1825,"t":"7. Comprehensive Query","u":"/jimmer-doc/docs/showcase/comprehensive-query","b":["View more","Showcase ★"]},{"i":1831,"t":"3. Recursive Query","u":"/jimmer-doc/docs/showcase/recursive-query/","b":["View more","Showcase ★","3. Recursive Query"]},{"i":1832,"t":"2.2 More Associations","u":"/jimmer-doc/docs/showcase/fetch-association/more-association","b":["View more","Showcase ★","2. Fetch Associations"]},{"i":1837,"t":"5.1 Basic Usage","u":"/jimmer-doc/docs/showcase/order-by/usage","b":["View more","Showcase ★","5. Sorting"]},{"i":1844,"t":"6. Paging Query","u":"/jimmer-doc/docs/showcase/page","b":["View more","Showcase ★"]},{"i":1851,"t":"3.4 Multiple Properties","u":"/jimmer-doc/docs/showcase/recursive-query/multiple-props","b":["View more","Showcase ★","3. Recursive Query"]},{"i":1856,"t":"3.2 Limit Depth","u":"/jimmer-doc/docs/showcase/recursive-query/depth","b":["View more","Showcase ★","3. Recursive Query"]},{"i":1861,"t":"8. Other Queries","u":"/jimmer-doc/docs/showcase/other-query","b":["View more","Showcase ★"]},{"i":1866,"t":"4. Where","u":"/jimmer-doc/docs/showcase/where/","b":["View more","Showcase ★","4. Where"]},{"i":1867,"t":"X. To be Continued...","u":"/jimmer-doc/docs/showcase/to-be-conitnued","b":["View more","Showcase ★"]},{"i":1869,"t":"3.2 Control Recursion Of Node","u":"/jimmer-doc/docs/showcase/recursive-query/node-control","b":["View more","Showcase ★","3. Recursive Query"]},{"i":1874,"t":"4.3 Associated Id","u":"/jimmer-doc/docs/showcase/where/associated-id","b":["View more","Showcase ★","4. Where"]},{"i":1879,"t":"4.4 Dynamic Table Join","u":"/jimmer-doc/docs/showcase/where/dynamic-join","b":["View more","Showcase ★","4. Where"]},{"i":1891,"t":"9. Update statement","u":"/jimmer-doc/docs/showcase/update-statement","b":["View more","Showcase ★"]},{"i":1892,"t":"4.5 Implicit Subquery","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","b":["View more","Showcase ★","4. Where"]},{"i":1903,"t":"Spring","u":"/jimmer-doc/docs/spring/","b":["View more","Spring"]},{"i":1905,"t":"Appendix","u":"/jimmer-doc/docs/spring/appendix","b":["View more","Spring"]},{"i":1907,"t":"Spring Data","u":"/jimmer-doc/docs/spring/repository/","b":["View more","Spring","Spring Data"]},{"i":1909,"t":"Define Repository","u":"/jimmer-doc/docs/spring/repository/concept","b":["View more","Spring","Spring Data"]},{"i":1911,"t":"3.1 Basic usage","u":"/jimmer-doc/docs/showcase/recursive-query/usage","b":["View more","Showcase ★","3. Recursive Query"]},{"i":1916,"t":"4.1 Base Usage","u":"/jimmer-doc/docs/showcase/where/usage","b":["View more","Showcase ★","4. Where"]},{"i":1926,"t":"Remote Associations","u":"/jimmer-doc/docs/spring/spring-cloud","b":["View more","Spring"]},{"i":1942,"t":"4.2 Dynamic Conditions","u":"/jimmer-doc/docs/showcase/where/dynamic-where","b":["View more","Showcase ★","4. Where"]},{"i":1949,"t":"Spring Transaction","u":"/jimmer-doc/docs/spring/transaction","b":["View more","Spring"]},{"i":1960,"t":"Query DTO","u":"/jimmer-doc/docs/spring/repository/dto","b":["View more","Spring","Spring Data"]},{"i":1974,"t":"Simple Queries","u":"/jimmer-doc/docs/spring/repository/abstract","b":["View more","Spring","Spring Data"]},{"i":1986,"t":"Complex Queries","u":"/jimmer-doc/docs/spring/repository/default","b":["View more","Spring","Spring Data"]}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/1",[]],["t/2",[0,4.314,1,3.58,2,3.58]],["t/4",[1,3.58,2,3.58,3,3.871]],["t/6",[1,3.58,2,3.58,4,4.314]],["t/8",[5,6.397]],["t/10",[6,3.141,7,4.277]],["t/12",[6,3.899]],["t/14",[6,3.141,8,3.637]],["t/26",[6,3.141,9,5.153]],["t/32",[6,3.141,10,4.277]],["t/47",[6,2.629,11,4.314,12,3.363]],["t/49",[6,2.629,13,3.871,14,3.58]],["t/56",[15,4.624,16,3.359]],["t/57",[6,3.141,17,2.4]],["t/77",[18,3.489,19,4.624]],["t/88",[20,5.309]],["t/89",[21,3.709,22,3.079,23,3.709,24,2.742]],["t/110",[6,3.141,25,5.153]],["t/123",[26,6.397]],["t/125",[27,5.153,28,4.624]],["t/131",[20,3.58,29,3.58,30,4.314]],["t/149",[6,2.629,13,3.871,14,3.58]],["t/151",[31,4.624,32,5.153]],["t/160",[33,3.58,34,3.871,35,3.58]],["t/162",[33,3.58,35,3.58,36,3.871]],["t/164",[37,6.397]],["t/170",[38,5.153,39,5.153]],["t/177",[17,2.009,40,3.363,41,3.871]],["t/179",[33,3.58,42,3.871,43,3.58]],["t/181",[44,4.314,45,4.314,46,3.189]],["t/187",[47,6.397]],["t/189",[48,4.624,49,4.624]],["t/191",[20,3.58,29,3.58,50,4.314]],["t/214",[51,4.624,52,5.153]],["t/220",[7,4.277,53,4.624]],["t/222",[54,4.624,55,5.153]],["t/232",[56,6.397]],["t/234",[18,3.489,19,4.624]],["t/239",[57,5.153,58,5.153]],["t/254",[59,4.17]],["t/256",[15,4.624,59,3.359]],["t/258",[10,4.277,60,3.637]],["t/260",[61,6.397]],["t/267",[]],["t/268",[62,3.399]],["t/278",[36,4.624,59,3.359]],["t/288",[59,2.812,63,4.314,64,4.314]],["t/295",[65,6.397]],["t/308",[59,3.359,66,4.624]],["t/319",[60,3.637,67,5.153]],["t/334",[68,4.624,69,3.809]],["t/336",[70,5.309]],["t/343",[71,4.277,72,3.489]],["t/351",[73,6.397]],["t/356",[74,6.397]],["t/363",[17,2.4,75,4.624]],["t/369",[12,4.017,60,3.637]],["t/371",[72,3.489,76,3.244]],["t/377",[77,6.397]],["t/394",[59,3.359,78,4.624]],["t/396",[17,2.4,59,3.359]],["t/398",[79,5.819]],["t/406",[79,4.277,80,4.277]],["t/412",[79,4.277,80,4.277]],["t/414",[80,5.819]],["t/424",[81,6.397]],["t/440",[59,3.359,82,4.624]],["t/459",[24,3.189,72,2.92,76,2.716]],["t/472",[70,3.079,83,3.709,84,3.709,85,3.709]],["t/480",[34,4.624,35,4.277]],["t/495",[7,4.277,86,4.624]],["t/503",[87,6.397]],["t/514",[88,6.397]],["t/516",[69,3.809,89,4.624]],["t/529",[66,4.624,90,5.153]],["t/544",[69,3.809,91,4.017]],["t/549",[89,4.624,92,3.359]],["t/551",[92,2.812,93,4.314,94,3.871]],["t/567",[17,2.979]],["t/568",[17,2.009,72,2.92,95,4.314]],["t/585",[8,2.618,17,1.728,43,3.079,92,2.418]],["t/598",[17,2.4,96,4.624]],["t/613",[97,5.153,98,5.153]],["t/623",[17,2.009,40,3.363,41,3.871]],["t/637",[8,3.637,99,5.153]],["t/643",[96,4.624,100,4.277]],["t/657",[101,5.153,102,3.489]],["t/659",[103,5.153,104,5.153]],["t/661",[42,4.624,105,5.153]],["t/673",[106,4.624,107,4.624]],["t/685",[102,2.92,106,3.871,108,3.871]],["t/695",[109,5.741]],["t/707",[110,4.17]],["t/710",[48,3.871,49,3.871,111,4.314]],["t/724",[112,4.314,113,4.314,114,4.314]],["t/745",[43,3.079,92,2.418,115,3.079,116,3.329]],["t/776",[91,4.017,117,4.624]],["t/785",[16,3.359,18,3.489]],["t/796",[10,4.277,118,4.624]],["t/820",[8,4.515]],["t/822",[119,6.397]],["t/824",[120,5.153,121,5.153]],["t/826",[14,5.309]],["t/835",[122,4.17]],["t/856",[123,5.741]],["t/864",[102,3.489,124,5.153]],["t/866",[53,5.741]],["t/894",[125,5.153,126,5.153]],["t/922",[127,6.397]],["t/930",[128,4.624,129,5.153]],["t/932",[130,4.987]],["t/934",[131,5.153,132,5.153]],["t/947",[107,5.741]],["t/970",[133,5.153,134,5.153]],["t/983",[102,3.489,108,4.624]],["t/1059",[94,4.624,135,5.153]],["t/1066",[70,4.277,110,3.359]],["t/1074",[62,3.399]],["t/1076",[76,3.244,122,3.359]],["t/1078",[17,2.009,136,4.314,137,4.314]],["t/1084",[138,6.397]],["t/1113",[76,2.336,110,2.418,139,3.709,140,3.709]],["t/1124",[76,2.716,141,4.314,142,4.314]],["t/1129",[109,4.624,123,4.624]],["t/1135",[17,2.009,62,2.292,72,2.92]],["t/1146",[143,5.741]],["t/1180",[122,3.359,144,5.153]],["t/1190",[24,3.809,122,3.359]],["t/1197",[76,3.244,145,5.153]],["t/1205",[24,3.809,146,5.153]],["t/1207",[68,4.624,69,3.809]],["t/1220",[147,4.624,148,5.153]],["t/1240",[115,4.277,149,5.153]],["t/1245",[24,3.809,150,5.153]],["t/1270",[151,4.624,152,4.277]],["t/1278",[54,3.871,153,4.314,154,3.871]],["t/1284",[8,3.637,155,5.153]],["t/1289",[62,2.738,102,3.489]],["t/1300",[46,3.189,76,2.716,156,4.314]],["t/1321",[100,3.58,128,3.871,157,3.363]],["t/1323",[60,3.637,158,5.153]],["t/1332",[16,3.359,18,3.489]],["t/1339",[159,5.153,160,4.624]],["t/1341",[46,3.189,147,3.871,161,4.314]],["t/1349",[12,4.017,60,3.637]],["t/1364",[154,4.624,162,5.153]],["t/1408",[17,2.979]],["t/1431",[46,3.189,72,2.92,76,2.716]],["t/1439",[46,3.189,163,4.314,164,3.58]],["t/1448",[152,5.309]],["t/1466",[143,5.741]],["t/1471",[165,4.624,166,4.624]],["t/1501",[62,1.971,122,2.418,167,2.418,168,3.079]],["t/1503",[12,4.017,169,5.153]],["t/1505",[62,1.971,168,3.079,170,2.618,171,3.329]],["t/1510",[16,4.17]],["t/1532",[110,3.359,172,4.624]],["t/1534",[165,4.624,166,4.624]],["t/1543",[62,2.738,173,4.277]],["t/1555",[174,6.397]],["t/1557",[175,6.397]],["t/1559",[71,3.58,176,4.314,177,3.871]],["t/1572",[110,3.359,130,4.017]],["t/1591",[31,4.624,178,4.624]],["t/1597",[178,4.624,179,5.153]],["t/1608",[29,4.277,180,5.153]],["t/1613",[16,3.359,181,5.153]],["t/1626",[102,2.92,177,3.871,182,4.314]],["t/1652",[110,3.359,130,4.017]],["t/1668",[110,3.359,172,4.624]],["t/1670",[183,6.397]],["t/1683",[92,2.418,168,3.079,171,3.329,184,2.261]],["t/1685",[3,3.871,17,2.009,92,2.812]],["t/1694",[110,3.359,130,4.017]],["t/1705",[17,2.009,92,2.812,185,4.314]],["t/1716",[22,4.277,71,4.277]],["t/1732",[186,6.397]],["t/1733",[187,6.397]],["t/1735",[92,2.812,115,3.58,116,3.871]],["t/1754",[188,6.397]],["t/1756",[189,6.397]],["t/1768",[190,5.153,191,5.153]],["t/1784",[18,2.92,62,2.292,170,3.044]],["t/1792",[69,3.189,91,3.363,192,4.314]],["t/1793",[193,6.397]],["t/1794",[17,2.009,184,2.629,194,4.314]],["t/1795",[17,1.728,167,2.418,184,2.261,195,3.709]],["t/1800",[8,2.618,17,1.728,170,2.618,184,2.261]],["t/1805",[17,1.728,40,2.892,184,2.261,196,2.418]],["t/1814",[122,2.418,164,3.079,184,2.261,197,2.892]],["t/1824",[164,4.277,197,4.017]],["t/1825",[62,2.292,198,4.314,199,4.314]],["t/1831",[62,2.292,167,2.812,173,3.58]],["t/1832",[17,1.728,86,3.329,184,3.379]],["t/1837",[16,2.418,18,2.511,170,2.618,197,2.892]],["t/1844",[62,2.292,160,3.871,200,4.314]],["t/1851",[51,3.329,60,2.618,167,2.418,196,2.418]],["t/1856",[167,2.418,184,2.261,201,3.709,202,3.709]],["t/1861",[62,2.738,203,5.153]],["t/1866",[196,4.17]],["t/1867",[204,5.153,205,5.153]],["t/1869",[28,2.92,167,2.121,173,2.701,184,1.983,206,3.254]],["t/1874",[17,1.728,40,2.892,167,2.418,196,2.418]],["t/1879",[72,2.203,76,2.049,122,2.121,196,3.272]],["t/1891",[91,3.363,117,3.871,207,4.314]],["t/1892",[151,3.329,152,3.079,196,2.418,197,2.892]],["t/1903",[157,4.987]],["t/1905",[208,6.397]],["t/1907",[100,4.277,157,4.017]],["t/1909",[22,4.277,209,5.153]],["t/1911",[16,2.418,18,2.511,167,2.418,170,2.618]],["t/1916",[16,2.418,78,3.329,170,2.618,196,2.418]],["t/1926",[17,2.4,75,4.624]],["t/1942",[122,2.418,184,2.261,196,2.418,210,3.709]],["t/1949",[157,4.017,211,5.153]],["t/1960",[62,2.738,102,3.489]],["t/1974",[62,2.738,82,4.624]],["t/1986",[62,2.738,118,4.624]]],"invertedIndex":[["1",{"_index":170,"t":{"1505":{"position":[[0,1]]},"1784":{"position":[[0,1]]},"1800":{"position":[[2,1]]},"1837":{"position":[[2,1]]},"1911":{"position":[[2,1]]},"1916":{"position":[[2,1]]}}}],["10",{"_index":192,"t":{"1792":{"position":[[0,2]]}}}],["2",{"_index":184,"t":{"1683":{"position":[[0,1]]},"1794":{"position":[[0,1]]},"1795":{"position":[[0,1]]},"1800":{"position":[[0,1]]},"1805":{"position":[[0,1]]},"1814":{"position":[[2,1]]},"1832":{"position":[[0,1],[2,1]]},"1856":{"position":[[2,1]]},"1869":{"position":[[2,1]]},"1942":{"position":[[2,1]]}}}],["3",{"_index":167,"t":{"1501":{"position":[[0,1]]},"1795":{"position":[[2,1]]},"1831":{"position":[[0,1]]},"1851":{"position":[[0,1]]},"1856":{"position":[[0,1]]},"1869":{"position":[[0,1]]},"1874":{"position":[[2,1]]},"1911":{"position":[[0,1]]}}}],["4",{"_index":196,"t":{"1805":{"position":[[2,1]]},"1851":{"position":[[2,1]]},"1866":{"position":[[0,1]]},"1874":{"position":[[0,1]]},"1879":{"position":[[0,1],[2,1]]},"1892":{"position":[[0,1]]},"1916":{"position":[[0,1]]},"1942":{"position":[[0,1]]}}}],["5",{"_index":197,"t":{"1814":{"position":[[0,1]]},"1824":{"position":[[0,1]]},"1837":{"position":[[0,1]]},"1892":{"position":[[2,1]]}}}],["6",{"_index":200,"t":{"1844":{"position":[[0,1]]}}}],["7",{"_index":198,"t":{"1825":{"position":[[0,1]]}}}],["8",{"_index":203,"t":{"1861":{"position":[[0,1]]}}}],["9",{"_index":207,"t":{"1891":{"position":[[0,1]]}}}],["abandon",{"_index":13,"t":{"49":{"position":[[6,9]]},"149":{"position":[[6,9]]}}}],["advanc",{"_index":15,"t":{"56":{"position":[[0,8]]},"256":{"position":[[0,8]]}}}],["aggreg",{"_index":115,"t":{"745":{"position":[[13,9]]},"1240":{"position":[[0,9]]},"1735":{"position":[[5,9]]}}}],["api",{"_index":30,"t":{"131":{"position":[[16,3]]}}}],["appendix",{"_index":208,"t":{"1905":{"position":[[0,8]]}}}],["apt",{"_index":131,"t":{"934":{"position":[[0,3]]}}}],["arbitrari",{"_index":168,"t":{"1501":{"position":[[3,9]]},"1505":{"position":[[9,9]]},"1683":{"position":[[8,9]]}}}],["associ",{"_index":17,"t":{"57":{"position":[[0,11]]},"177":{"position":[[0,10]]},"363":{"position":[[7,11]]},"396":{"position":[[0,11]]},"567":{"position":[[0,12]]},"568":{"position":[[8,11]]},"585":{"position":[[13,10]]},"598":{"position":[[0,11]]},"623":{"position":[[0,10]]},"1078":{"position":[[0,11]]},"1135":{"position":[[9,11]]},"1408":{"position":[[0,12]]},"1685":{"position":[[10,12]]},"1705":{"position":[[11,12]]},"1794":{"position":[[9,12]]},"1795":{"position":[[11,11]]},"1800":{"position":[[4,10]]},"1805":{"position":[[4,10]]},"1832":{"position":[[9,12]]},"1874":{"position":[[4,10]]},"1926":{"position":[[7,12]]}}}],["base",{"_index":78,"t":{"394":{"position":[[0,4]]},"1916":{"position":[[4,4]]}}}],["basic",{"_index":18,"t":{"77":{"position":[[0,5]]},"234":{"position":[[0,5]]},"785":{"position":[[0,5]]},"1332":{"position":[[0,5]]},"1784":{"position":[[3,5]]},"1837":{"position":[[4,5]]},"1911":{"position":[[4,5]]}}}],["batch",{"_index":27,"t":{"125":{"position":[[0,5]]}}}],["befor",{"_index":94,"t":{"551":{"position":[[12,6]]},"1059":{"position":[[0,6]]}}}],["benchmark",{"_index":133,"t":{"970":{"position":[[0,9]]}}}],["blog",{"_index":1,"t":{"2":{"position":[[6,4]]},"4":{"position":[[5,4]]},"6":{"position":[[4,4]]}}}],["cach",{"_index":6,"t":{"10":{"position":[[0,5]]},"12":{"position":[[0,5]]},"14":{"position":[[7,5]]},"26":{"position":[[0,5]]},"32":{"position":[[11,5]]},"47":{"position":[[11,5]]},"49":{"position":[[0,5]]},"57":{"position":[[12,5]]},"110":{"position":[[7,5]]},"149":{"position":[[0,5]]}}}],["cacheabl",{"_index":23,"t":{"89":{"position":[[13,9]]}}}],["calcul",{"_index":10,"t":{"32":{"position":[[0,10]]},"258":{"position":[[0,10]]},"796":{"position":[[8,11]]}}}],["chain",{"_index":137,"t":{"1078":{"position":[[17,8]]}}}],["check",{"_index":41,"t":{"177":{"position":[[14,8]]},"623":{"position":[[14,8]]}}}],["classif",{"_index":96,"t":{"598":{"position":[[12,14]]},"643":{"position":[[5,14]]}}}],["client",{"_index":20,"t":{"88":{"position":[[0,6]]},"131":{"position":[[9,6]]},"191":{"position":[[9,6]]}}}],["code",{"_index":180,"t":{"1608":{"position":[[9,4]]}}}],["command",{"_index":89,"t":{"516":{"position":[[7,7]]},"549":{"position":[[5,7]]}}}],["comparison",{"_index":174,"t":{"1555":{"position":[[0,10]]}}}],["complex",{"_index":118,"t":{"796":{"position":[[0,7]]},"1986":{"position":[[0,7]]}}}],["comprehens",{"_index":199,"t":{"1825":{"position":[[3,13]]}}}],["concept",{"_index":19,"t":{"77":{"position":[[6,8]]},"234":{"position":[[6,8]]}}}],["condit",{"_index":210,"t":{"1942":{"position":[[12,10]]}}}],["configur",{"_index":26,"t":{"123":{"position":[[0,13]]}}}],["conflict",{"_index":142,"t":{"1124":{"position":[[6,8]]}}}],["connect",{"_index":38,"t":{"170":{"position":[[0,10]]}}}],["consist",{"_index":9,"t":{"26":{"position":[[6,11]]}}}],["continu",{"_index":205,"t":{"1867":{"position":[[9,9]]}}}],["control",{"_index":28,"t":{"125":{"position":[[6,7]]},"1869":{"position":[[4,7]]}}}],["convers",{"_index":124,"t":{"864":{"position":[[4,10]]}}}],["convert",{"_index":90,"t":{"529":{"position":[[5,9]]}}}],["creat",{"_index":178,"t":{"1591":{"position":[[0,6]]},"1597":{"position":[[0,6]]}}}],["current",{"_index":120,"t":{"824":{"position":[[0,7]]}}}],["custom",{"_index":150,"t":{"1245":{"position":[[0,6]]}}}],["data",{"_index":100,"t":{"643":{"position":[[0,4]]},"1321":{"position":[[20,4]]},"1907":{"position":[[7,4]]}}}],["databas",{"_index":31,"t":{"151":{"position":[[0,8]]},"1591":{"position":[[7,8]]}}}],["datasourc",{"_index":52,"t":{"214":{"position":[[9,11]]}}}],["deep",{"_index":161,"t":{"1341":{"position":[[0,4]]}}}],["deeper",{"_index":195,"t":{"1795":{"position":[[4,6]]}}}],["default",{"_index":33,"t":{"160":{"position":[[0,7]]},"162":{"position":[[0,7]]},"179":{"position":[[0,7]]}}}],["defin",{"_index":22,"t":{"89":{"position":[[5,7]]},"1716":{"position":[[0,6]]},"1909":{"position":[[0,6]]}}}],["delet",{"_index":69,"t":{"334":{"position":[[8,8]]},"516":{"position":[[0,6]]},"544":{"position":[[0,6]]},"1207":{"position":[[8,8]]},"1792":{"position":[[4,6]]}}}],["depth",{"_index":202,"t":{"1856":{"position":[[10,5]]}}}],["dialect",{"_index":37,"t":{"164":{"position":[[0,7]]}}}],["directli",{"_index":176,"t":{"1559":{"position":[[0,8]]}}}],["discuss",{"_index":187,"t":{"1733":{"position":[[0,7]]}}}],["dissoci",{"_index":42,"t":{"179":{"position":[[8,12]]},"661":{"position":[[0,12]]}}}],["draft",{"_index":138,"t":{"1084":{"position":[[0,5]]}}}],["dsl",{"_index":162,"t":{"1364":{"position":[[0,3]]}}}],["dto",{"_index":102,"t":{"657":{"position":[[6,3]]},"685":{"position":[[6,3]]},"864":{"position":[[0,3]]},"983":{"position":[[0,3]]},"1289":{"position":[[9,4]]},"1626":{"position":[[14,3]]},"1960":{"position":[[6,3]]}}}],["dynam",{"_index":122,"t":{"835":{"position":[[0,10]]},"1076":{"position":[[0,7]]},"1180":{"position":[[0,7]]},"1190":{"position":[[0,7]]},"1501":{"position":[[13,7]]},"1814":{"position":[[4,7]]},"1879":{"position":[[4,7]]},"1942":{"position":[[4,7]]}}}],["ecosystem",{"_index":189,"t":{"1756":{"position":[[0,9]]}}}],["embed",{"_index":67,"t":{"319":{"position":[[0,8]]}}}],["enabl",{"_index":25,"t":{"110":{"position":[[0,6]]}}}],["entiti",{"_index":71,"t":{"343":{"position":[[0,6]]},"1559":{"position":[[16,8]]},"1716":{"position":[[7,8]]}}}],["enum",{"_index":36,"t":{"162":{"position":[[8,4]]},"278":{"position":[[0,4]]}}}],["error",{"_index":50,"t":{"191":{"position":[[16,6]]}}}],["exampl",{"_index":191,"t":{"1768":{"position":[[9,8]]}}}],["expos",{"_index":172,"t":{"1532":{"position":[[0,8]]},"1668":{"position":[[0,8]]}}}],["express",{"_index":154,"t":{"1278":{"position":[[11,11]]},"1364":{"position":[[4,11]]}}}],["fake",{"_index":84,"t":{"472":{"position":[[9,4]]}}}],["featur",{"_index":110,"t":{"707":{"position":[[6,8]]},"1066":{"position":[[4,8]]},"1113":{"position":[[5,8]]},"1532":{"position":[[9,8]]},"1572":{"position":[[0,7]]},"1652":{"position":[[0,7]]},"1668":{"position":[[9,8]]},"1694":{"position":[[0,7]]}}}],["fetch",{"_index":194,"t":{"1794":{"position":[[3,5]]}}}],["fetcher",{"_index":155,"t":{"1284":{"position":[[7,7]]}}}],["filter",{"_index":24,"t":{"89":{"position":[[23,7]]},"459":{"position":[[11,6]]},"1190":{"position":[[8,9]]},"1205":{"position":[[7,7]]},"1245":{"position":[[7,7]]}}}],["final",{"_index":181,"t":{"1613":{"position":[[0,5]]}}}],["first",{"_index":0,"t":{"2":{"position":[[0,5]]}}}],["foreign",{"_index":85,"t":{"472":{"position":[[14,7]]}}}],["form",{"_index":104,"t":{"659":{"position":[[7,4]]}}}],["formula",{"_index":65,"t":{"295":{"position":[[0,7]]}}}],["gener",{"_index":29,"t":{"131":{"position":[[0,8]]},"191":{"position":[[0,8]]},"1608":{"position":[[0,8]]}}}],["global",{"_index":146,"t":{"1205":{"position":[[0,6]]}}}],["graphql",{"_index":56,"t":{"232":{"position":[[0,7]]}}}],["group",{"_index":149,"t":{"1240":{"position":[[12,5]]}}}],["handl",{"_index":112,"t":{"724":{"position":[[0,6]]}}}],["id",{"_index":40,"t":{"177":{"position":[[11,2]]},"623":{"position":[[11,2]]},"1805":{"position":[[15,2]]},"1874":{"position":[[15,2]]}}}],["idview",{"_index":81,"t":{"424":{"position":[[0,6]]}}}],["immut",{"_index":119,"t":{"822":{"position":[[0,12]]}}}],["implicit",{"_index":151,"t":{"1270":{"position":[[0,8]]},"1892":{"position":[[4,8]]}}}],["incomplet",{"_index":99,"t":{"637":{"position":[[0,10]]}}}],["input",{"_index":101,"t":{"657":{"position":[[0,5]]}}}],["interceptor",{"_index":93,"t":{"551":{"position":[[0,11]]}}}],["introduct",{"_index":130,"t":{"932":{"position":[[0,12]]},"1572":{"position":[[8,12]]},"1652":{"position":[[8,12]]},"1694":{"position":[[8,12]]}}}],["jackson",{"_index":129,"t":{"930":{"position":[[13,7]]}}}],["join",{"_index":76,"t":{"371":{"position":[[0,4]]},"459":{"position":[[0,4]]},"1076":{"position":[[8,4]]},"1113":{"position":[[0,4]]},"1124":{"position":[[15,5]]},"1197":{"position":[[5,4]]},"1300":{"position":[[21,5]]},"1431":{"position":[[6,4]]},"1879":{"position":[[18,4]]}}}],["json",{"_index":66,"t":{"308":{"position":[[0,4]]},"529":{"position":[[0,4]]}}}],["key",{"_index":70,"t":{"336":{"position":[[0,3]]},"472":{"position":[[22,4]]},"1066":{"position":[[0,3]]}}}],["kotlin",{"_index":140,"t":{"1113":{"position":[[26,6]]}}}],["ksp",{"_index":132,"t":{"934":{"position":[[4,3]]}}}],["languag",{"_index":108,"t":{"685":{"position":[[10,8]]},"983":{"position":[[4,8]]}}}],["limit",{"_index":201,"t":{"1856":{"position":[[4,5]]}}}],["list",{"_index":44,"t":{"181":{"position":[[3,4]]}}}],["lock",{"_index":49,"t":{"189":{"position":[[12,4]]},"710":{"position":[[23,4]]}}}],["log",{"_index":55,"t":{"222":{"position":[[4,3]]}}}],["logic",{"_index":68,"t":{"334":{"position":[[0,7]]},"1207":{"position":[[0,7]]}}}],["lone",{"_index":103,"t":{"659":{"position":[[0,6]]}}}],["long",{"_index":3,"t":{"4":{"position":[[0,4]]},"1685":{"position":[[5,4]]}}}],["manag",{"_index":39,"t":{"170":{"position":[[11,7]]}}}],["mani",{"_index":79,"t":{"398":{"position":[[0,4],[8,4]]},"406":{"position":[[0,4]]},"412":{"position":[[7,4]]}}}],["manytomanyview",{"_index":77,"t":{"377":{"position":[[0,14]]}}}],["map",{"_index":59,"t":{"254":{"position":[[0,7]]},"256":{"position":[[9,7]]},"278":{"position":[[5,7]]},"288":{"position":[[15,7]]},"308":{"position":[[5,7]]},"394":{"position":[[5,7]]},"396":{"position":[[12,7]]},"440":{"position":[[7,7]]}}}],["mappedsuperclass",{"_index":73,"t":{"351":{"position":[[0,16]]}}}],["mapstruct",{"_index":107,"t":{"673":{"position":[[6,9]]},"947":{"position":[[0,9]]}}}],["mdx",{"_index":4,"t":{"6":{"position":[[0,3]]}}}],["merg",{"_index":141,"t":{"1124":{"position":[[0,5]]}}}],["method",{"_index":126,"t":{"894":{"position":[[5,7]]}}}],["microservic",{"_index":47,"t":{"187":{"position":[[0,12]]}}}],["mode",{"_index":43,"t":{"179":{"position":[[21,4]]},"585":{"position":[[5,4]]},"745":{"position":[[5,4]]}}}],["modif",{"_index":88,"t":{"514":{"position":[[0,12]]}}}],["more",{"_index":86,"t":{"495":{"position":[[0,4]]},"1832":{"position":[[4,4]]}}}],["multi",{"_index":11,"t":{"47":{"position":[[0,5]]}}}],["multipl",{"_index":51,"t":{"214":{"position":[[0,8]]},"1851":{"position":[[4,8]]}}}],["mutabl",{"_index":95,"t":{"568":{"position":[[0,7]]}}}],["mutat",{"_index":61,"t":{"260":{"position":[[0,8]]}}}],["name",{"_index":34,"t":{"160":{"position":[[8,6]]},"480":{"position":[[0,6]]}}}],["nativ",{"_index":153,"t":{"1278":{"position":[[0,6]]}}}],["node",{"_index":206,"t":{"1869":{"position":[[25,4]]}}}],["non",{"_index":63,"t":{"288":{"position":[[0,3]]}}}],["null",{"_index":113,"t":{"724":{"position":[[7,4]]}}}],["nulliti",{"_index":87,"t":{"503":{"position":[[0,7]]}}}],["object",{"_index":8,"t":{"14":{"position":[[0,6]]},"585":{"position":[[24,7]]},"637":{"position":[[11,6]]},"820":{"position":[[0,6]]},"1284":{"position":[[0,6]]},"1800":{"position":[[15,6]]}}}],["on",{"_index":80,"t":{"406":{"position":[[8,3]]},"412":{"position":[[0,3]]},"414":{"position":[[0,3],[7,3]]}}}],["ondissoci",{"_index":74,"t":{"356":{"position":[[0,12]]}}}],["oper",{"_index":105,"t":{"661":{"position":[[13,10]]}}}],["optim",{"_index":46,"t":{"181":{"position":[[18,12]]},"1300":{"position":[[0,8]]},"1341":{"position":[[16,12]]},"1431":{"position":[[11,12]]},"1439":{"position":[[16,12]]}}}],["optimist",{"_index":111,"t":{"710":{"position":[[0,10]]}}}],["order",{"_index":144,"t":{"1180":{"position":[[8,8]]}}}],["ordinari",{"_index":158,"t":{"1323":{"position":[[0,8]]}}}],["output",{"_index":182,"t":{"1626":{"position":[[7,6]]}}}],["overview",{"_index":143,"t":{"1146":{"position":[[0,8]]},"1466":{"position":[[0,8]]}}}],["owner",{"_index":97,"t":{"613":{"position":[[0,5]]}}}],["page",{"_index":160,"t":{"1339":{"position":[[6,6]]},"1844":{"position":[[3,6]]}}}],["pagin",{"_index":147,"t":{"1220":{"position":[[0,10]]},"1341":{"position":[[5,10]]}}}],["path",{"_index":136,"t":{"1078":{"position":[[12,4]]}}}],["pessimist",{"_index":48,"t":{"189":{"position":[[0,11]]},"710":{"position":[[11,11]]}}}],["post",{"_index":2,"t":{"2":{"position":[[11,4]]},"4":{"position":[[10,4]]},"6":{"position":[[9,4]]}}}],["precondit",{"_index":183,"t":{"1670":{"position":[[0,12]]}}}],["predic",{"_index":45,"t":{"181":{"position":[[8,9]]}}}],["problem",{"_index":109,"t":{"695":{"position":[[0,7]]},"1129":{"position":[[0,8]]}}}],["project",{"_index":179,"t":{"1597":{"position":[[9,7]]}}}],["properti",{"_index":60,"t":{"258":{"position":[[11,10]]},"319":{"position":[[9,10]]},"369":{"position":[[5,10]]},"1323":{"position":[[9,10]]},"1349":{"position":[[5,10]]},"1851":{"position":[[13,10]]}}}],["provid",{"_index":58,"t":{"239":{"position":[[7,8]]}}}],["qbe",{"_index":166,"t":{"1471":{"position":[[6,3]]},"1534":{"position":[[6,3]]}}}],["queri",{"_index":62,"t":{"268":{"position":[[0,5]]},"1074":{"position":[[0,5]]},"1135":{"position":[[0,8]]},"1289":{"position":[[0,8]]},"1501":{"position":[[21,5]]},"1505":{"position":[[3,5]]},"1543":{"position":[[10,5]]},"1784":{"position":[[9,5]]},"1825":{"position":[[17,5]]},"1831":{"position":[[13,5]]},"1844":{"position":[[10,5]]},"1861":{"position":[[9,7]]},"1960":{"position":[[0,5]]},"1974":{"position":[[7,7]]},"1986":{"position":[[8,7]]}}}],["quick",{"_index":169,"t":{"1503":{"position":[[0,5]]}}}],["read",{"_index":135,"t":{"1059":{"position":[[7,7]]}}}],["real",{"_index":83,"t":{"472":{"position":[[0,4]]}}}],["reason",{"_index":14,"t":{"49":{"position":[[16,6]]},"149":{"position":[[16,6]]},"826":{"position":[[0,6]]}}}],["recurs",{"_index":173,"t":{"1543":{"position":[[0,9]]},"1831":{"position":[[3,9]]},"1869":{"position":[[12,9]]}}}],["remot",{"_index":75,"t":{"363":{"position":[[0,6]]},"1926":{"position":[[0,6]]}}}],["report",{"_index":134,"t":{"970":{"position":[[10,6]]}}}],["repositori",{"_index":209,"t":{"1909":{"position":[[7,10]]}}}],["resourc",{"_index":186,"t":{"1732":{"position":[[0,9]]}}}],["return",{"_index":177,"t":{"1559":{"position":[[9,6]]},"1626":{"position":[[0,6]]}}}],["revers",{"_index":163,"t":{"1439":{"position":[[0,7]]}}}],["root",{"_index":116,"t":{"745":{"position":[[23,4]]},"1735":{"position":[[15,4]]}}}],["safeti",{"_index":148,"t":{"1220":{"position":[[11,6]]}}}],["save",{"_index":92,"t":{"549":{"position":[[0,4]]},"551":{"position":[[19,4]]},"585":{"position":[[0,4]]},"745":{"position":[[0,4]]},"1683":{"position":[[3,4]]},"1685":{"position":[[0,4]]},"1705":{"position":[[0,4]]},"1735":{"position":[[0,4]]}}}],["scalar",{"_index":57,"t":{"239":{"position":[[0,6]]}}}],["shape",{"_index":171,"t":{"1505":{"position":[[19,5]]},"1683":{"position":[[18,5]]}}}],["short",{"_index":185,"t":{"1705":{"position":[[5,5]]}}}],["showcas",{"_index":193,"t":{"1793":{"position":[[0,8]]}}}],["side",{"_index":98,"t":{"613":{"position":[[6,4]]}}}],["simpl",{"_index":82,"t":{"440":{"position":[[0,6]]},"1974":{"position":[[0,6]]}}}],["situat",{"_index":121,"t":{"824":{"position":[[8,9]]}}}],["smart",{"_index":159,"t":{"1339":{"position":[[0,5]]}}}],["solut",{"_index":123,"t":{"856":{"position":[[0,8]]},"1129":{"position":[[20,9]]}}}],["sort",{"_index":164,"t":{"1439":{"position":[[8,7]]},"1814":{"position":[[12,7]]},"1824":{"position":[[3,7]]}}}],["specif",{"_index":139,"t":{"1113":{"position":[[14,8]]}}}],["spring",{"_index":157,"t":{"1321":{"position":[[13,6]]},"1903":{"position":[[0,6]]},"1907":{"position":[[0,6]]},"1949":{"position":[[0,6]]}}}],["sql",{"_index":54,"t":{"222":{"position":[[0,3]]},"1278":{"position":[[7,3]]}}}],["standard",{"_index":190,"t":{"1768":{"position":[[0,8]]}}}],["start",{"_index":175,"t":{"1557":{"position":[[4,7]]}}}],["statement",{"_index":91,"t":{"544":{"position":[[7,9]]},"776":{"position":[[7,9]]},"1792":{"position":[[11,9]]},"1891":{"position":[[10,9]]}}}],["strategi",{"_index":35,"t":{"160":{"position":[[15,8]]},"162":{"position":[[13,8]]},"480":{"position":[[7,8]]}}}],["structur",{"_index":64,"t":{"288":{"position":[[4,10]]}}}],["subqueri",{"_index":152,"t":{"1270":{"position":[[9,8]]},"1448":{"position":[[0,10]]},"1892":{"position":[[13,8]]}}}],["super",{"_index":165,"t":{"1471":{"position":[[0,5]]},"1534":{"position":[[0,5]]}}}],["tabl",{"_index":72,"t":{"343":{"position":[[7,5]]},"371":{"position":[[5,5]]},"459":{"position":[[5,5]]},"568":{"position":[[20,5]]},"1135":{"position":[[21,6]]},"1431":{"position":[[0,5]]},"1879":{"position":[[12,5]]}}}],["tool",{"_index":125,"t":{"894":{"position":[[0,4]]}}}],["transact",{"_index":211,"t":{"1949":{"position":[[7,11]]}}}],["trigger",{"_index":53,"t":{"220":{"position":[[0,7]]},"866":{"position":[[0,7]]}}}],["type",{"_index":7,"t":{"10":{"position":[[6,4]]},"220":{"position":[[8,4]]},"495":{"position":[[5,5]]}}}],["unnecessari",{"_index":156,"t":{"1300":{"position":[[9,11]]}}}],["updat",{"_index":117,"t":{"776":{"position":[[0,6]]},"1891":{"position":[[3,6]]}}}],["us",{"_index":106,"t":{"673":{"position":[[0,5]]},"685":{"position":[[0,5]]}}}],["usag",{"_index":16,"t":{"56":{"position":[[9,5]]},"785":{"position":[[6,5]]},"1332":{"position":[[6,5]]},"1510":{"position":[[0,5]]},"1613":{"position":[[6,5]]},"1837":{"position":[[10,5]]},"1911":{"position":[[10,5]]},"1916":{"position":[[9,5]]}}}],["user",{"_index":21,"t":{"89":{"position":[[0,4]]}}}],["valid",{"_index":32,"t":{"151":{"position":[[9,10]]}}}],["valu",{"_index":114,"t":{"724":{"position":[[12,6]]}}}],["video",{"_index":188,"t":{"1754":{"position":[[0,5]]}}}],["view",{"_index":12,"t":{"47":{"position":[[6,4]]},"369":{"position":[[0,4]]},"1349":{"position":[[0,4]]},"1503":{"position":[[6,4]]}}}],["visibl",{"_index":127,"t":{"922":{"position":[[0,10]]}}}],["weak",{"_index":145,"t":{"1197":{"position":[[0,4]]}}}],["welcom",{"_index":5,"t":{"8":{"position":[[0,7]]}}}],["work",{"_index":128,"t":{"930":{"position":[[0,7]]},"1321":{"position":[[0,7]]}}}],["x",{"_index":204,"t":{"1867":{"position":[[0,1]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":16,"t":"Enabling Object Caching","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#enabling-object-caching","p":14},{"i":18,"t":"Using Object Cache","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#using-object-cache","p":14},{"i":20,"t":"Query Based on Id","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#query-based-on-id","p":14},{"i":22,"t":"Using Object Fetchers","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#using-object-fetchers","p":14},{"i":24,"t":"Cache Invalidation","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#cache-invalidation","p":14},{"i":28,"t":"Consistency of BinLog Trigger (Recommended)","u":"/jimmer-doc/docs/cache/consistency","h":"#consistency-of-binlog-trigger-recommended","p":26},{"i":30,"t":"Consistency of Transaction Trigger","u":"/jimmer-doc/docs/cache/consistency","h":"#consistency-of-transaction-trigger","p":26},{"i":34,"t":"Calculated Property Recap","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#calculated-property-recap","p":32},{"i":36,"t":"Enable Calculated Cache","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#enable-calculated-cache","p":32},{"i":38,"t":"Usage","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#usage","p":32},{"i":40,"t":"Cache Invalidation","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#cache-invalidation","p":32},{"i":41,"t":"Responding to Triggers","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#responding-to-triggers","p":32},{"i":43,"t":"When BOOK.STORE_ID is modified","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#when-bookstore_id-is-modified","p":32},{"i":45,"t":"Modifying BOOK.PRICE","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#modifying-bookprice","p":32},{"i":50,"t":"CacheAbandonedCallback","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#cacheabandonedcallback","p":49},{"i":52,"t":"Registering Callback","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#registering-callback","p":49},{"i":54,"t":"Default Behavior of Spring Boot Starter","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#default-behavior-of-spring-boot-starter","p":49},{"i":59,"t":"Enabling Association Cache","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#enabling-association-cache","p":57},{"i":61,"t":"Sorting Collection Associations","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#sorting-collection-associations","p":57},{"i":63,"t":"Usage","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#usage","p":57},{"i":65,"t":"One-to-Many: BookStore.books","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#one-to-many-bookstorebooks","p":57},{"i":67,"t":"Many-to-Many: Book.authors","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#many-to-many-bookauthors","p":57},{"i":69,"t":"Cache Invalidation","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#cache-invalidation","p":57},{"i":71,"t":"One-to-Many: BookStore.books","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#one-to-many-bookstorebooks-1","p":57},{"i":73,"t":"Many-to-Many: Book.authors","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#many-to-many-bookauthors-1","p":57},{"i":75,"t":"Notes on Logical Deletion","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#notes-on-logical-deletion","p":57},{"i":78,"t":"Concepts","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#concepts","p":77},{"i":80,"t":"Scenarios","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#scenarios","p":77},{"i":82,"t":"SubKey","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey","p":77},{"i":84,"t":"SubKey of Association Properties","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey-of-association-properties","p":77},{"i":86,"t":"SubKey of Complex Calculated Properties","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey-of-complex-calculated-properties","p":77},{"i":90,"t":"Cache-friendly Filters","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#cache-friendly-filters","p":89},{"i":91,"t":"Basic Concepts","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#basic-concepts","p":89},{"i":93,"t":"Define Cache-friendly Filters","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#define-cache-friendly-filters","p":89},{"i":95,"t":"Enable Multi-view Cache","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#enable-multi-view-cache","p":89},{"i":96,"t":"Simple Approach","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#simple-approach","p":89},{"i":98,"t":"Better Approach","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#better-approach","p":89},{"i":100,"t":"SubKey of Calculated Properties","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#subkey-of-calculated-properties","p":89},{"i":102,"t":"Usage","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#usage","p":89},{"i":104,"t":"Execute with one tenant identity","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#execute-with-one-tenant-identity","p":89},{"i":106,"t":"Execute repeatedly with multiple tenant identities","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#execute-repeatedly-with-multiple-tenant-identities","p":89},{"i":108,"t":"Cache Invalidation","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#cache-invalidation","p":89},{"i":111,"t":"CacheFactory Interface","u":"/jimmer-doc/docs/cache/enable-cache","h":"#cachefactory-interface","p":110},{"i":113,"t":"Multi-level Cache Architecture","u":"/jimmer-doc/docs/cache/enable-cache","h":"#multi-level-cache-architecture","p":110},{"i":115,"t":"Configuring CacheFactory","u":"/jimmer-doc/docs/cache/enable-cache","h":"#configuring-cachefactory","p":110},{"i":117,"t":"SpringBoot Configuration","u":"/jimmer-doc/docs/cache/enable-cache","h":"#springboot-configuration","p":110},{"i":119,"t":"Underlying API Configuration","u":"/jimmer-doc/docs/cache/enable-cache","h":"#underlying-api-configuration","p":110},{"i":121,"t":"Redis Cache Helper APIs","u":"/jimmer-doc/docs/cache/enable-cache","h":"#redis-cache-helper-apis","p":110},{"i":127,"t":"Use Spring Boot Starter","u":"/jimmer-doc/docs/configuration/batch-size","h":"#use-spring-boot-starter","p":125},{"i":129,"t":"Don't use Spring Boot Starter","u":"/jimmer-doc/docs/configuration/batch-size","h":"#dont-use-spring-boot-starter","p":125},{"i":132,"t":"Basic Concepts","u":"/jimmer-doc/docs/client/api","h":"#basic-concepts","p":131},{"i":134,"t":"Solution 1 (GraphQL)","u":"/jimmer-doc/docs/client/api","h":"#solution-1-graphql","p":131},{"i":136,"t":"Solution 2 (Not Recommended)","u":"/jimmer-doc/docs/client/api","h":"#solution-2-not-recommended","p":131},{"i":138,"t":"Solution 3 (Topic of This Article)","u":"/jimmer-doc/docs/client/api","h":"#solution-3-topic-of-this-article","p":131},{"i":140,"t":"Usage","u":"/jimmer-doc/docs/client/api","h":"#usage","p":131},{"i":141,"t":"Declare @FetchBy","u":"/jimmer-doc/docs/client/api","h":"#declare-fetchby","p":131},{"i":143,"t":"Generate Client Code","u":"/jimmer-doc/docs/client/api","h":"#generate-client-code","p":131},{"i":145,"t":"Develop Web Client Project","u":"/jimmer-doc/docs/client/api","h":"#develop-web-client-project","p":131},{"i":147,"t":"Integrate with Custom Data","u":"/jimmer-doc/docs/client/api","h":"#integrate-with-custom-data","p":131},{"i":152,"t":"Function Introduction","u":"/jimmer-doc/docs/configuration/database-validation","h":"#function-introduction","p":151},{"i":154,"t":"Enable Validation","u":"/jimmer-doc/docs/configuration/database-validation","h":"#enable-validation","p":151},{"i":156,"t":"Resolve Table Conflicts","u":"/jimmer-doc/docs/configuration/database-validation","h":"#resolve-table-conflicts","p":151},{"i":158,"t":"Temporarily ignore partial validation","u":"/jimmer-doc/docs/configuration/database-validation","h":"#temporarily-ignore-partial-validation","p":151},{"i":166,"t":"Set Dialect","u":"/jimmer-doc/docs/configuration/dialect","h":"#set-dialect","p":164},{"i":168,"t":"Dialect List","u":"/jimmer-doc/docs/configuration/dialect","h":"#dialect-list","p":164},{"i":171,"t":"Concept","u":"/jimmer-doc/docs/configuration/connection-manager","h":"#concept","p":170},{"i":173,"t":"Simple ConnectionManager","u":"/jimmer-doc/docs/configuration/connection-manager","h":"#simple-connectionmanager","p":170},{"i":175,"t":"ConnectionManager managed by Spring transaction","u":"/jimmer-doc/docs/configuration/connection-manager","h":"#connectionmanager-managed-by-spring-transaction","p":170},{"i":183,"t":"Enable Padding Optimization","u":"/jimmer-doc/docs/configuration/in-list-optimization","h":"#enable-padding-optimization","p":181},{"i":185,"t":"Enable Any Equality Optimization","u":"/jimmer-doc/docs/configuration/in-list-optimization","h":"#enable-any-equality-optimization","p":181},{"i":193,"t":"Exception Families","u":"/jimmer-doc/docs/client/error","h":"#exception-families","p":191},{"i":195,"t":"Define Exception Families","u":"/jimmer-doc/docs/client/error","h":"#define-exception-families","p":191},{"i":197,"t":"Add Fields to Error Codes","u":"/jimmer-doc/docs/client/error","h":"#add-fields-to-error-codes","p":191},{"i":199,"t":"Declare Exceptions for REST APIs","u":"/jimmer-doc/docs/client/error","h":"#declare-exceptions-for-rest-apis","p":191},{"i":200,"t":"Allow To Throw All Exceptions Of Family","u":"/jimmer-doc/docs/client/error","h":"#allow-to-throw-all-exceptions-of-family","p":191},{"i":202,"t":"Allow To Throw Some Exceptions Of Family","u":"/jimmer-doc/docs/client/error","h":"#allow-to-throw-some-exceptions-of-family","p":191},{"i":204,"t":"Export Server Side Exceptions","u":"/jimmer-doc/docs/client/error","h":"#export-server-side-exceptions","p":191},{"i":205,"t":"Throw Exceptions","u":"/jimmer-doc/docs/client/error","h":"#throw-exceptions","p":191},{"i":207,"t":"Write Exception Messages to HTTP Responses","u":"/jimmer-doc/docs/client/error","h":"#write-exception-messages-to-http-responses","p":191},{"i":209,"t":"Client","u":"/jimmer-doc/docs/client/error","h":"#client","p":191},{"i":210,"t":"Generated TypeScript Code","u":"/jimmer-doc/docs/client/error","h":"#generated-typescript-code","p":191},{"i":212,"t":"TypeScript IDE Effects","u":"/jimmer-doc/docs/client/error","h":"#typescript-ide-effects","p":191},{"i":216,"t":"Distributed Transaction Mode","u":"/jimmer-doc/docs/configuration/multi-datasources","h":"#distributed-transaction-mode","p":214},{"i":218,"t":"Local Transaction Mode","u":"/jimmer-doc/docs/configuration/multi-datasources","h":"#local-transaction-mode","p":214},{"i":224,"t":"Enable SQL Log","u":"/jimmer-doc/docs/configuration/sql-log","h":"#enable-sql-log","p":222},{"i":226,"t":"Pretty SQL","u":"/jimmer-doc/docs/configuration/sql-log","h":"#pretty-sql","p":222},{"i":228,"t":"Inline SQL Parameters","u":"/jimmer-doc/docs/configuration/sql-log","h":"#inline-sql-parameters","p":222},{"i":230,"t":"Embed Stack Trace","u":"/jimmer-doc/docs/configuration/sql-log","h":"#embed-stack-trace","p":222},{"i":235,"t":"Concepts","u":"/jimmer-doc/docs/graphql/concept","h":"#concepts","p":234},{"i":237,"t":"Notes","u":"/jimmer-doc/docs/graphql/concept","h":"#notes","p":234},{"i":240,"t":"Basic Concepts","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#basic-concepts","p":239},{"i":242,"t":"Global ScalarProvider","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#global-scalarprovider","p":239},{"i":244,"t":"Define ScalarProvider","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#define-scalarprovider","p":239},{"i":246,"t":"Register Scalar Provider","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#register-scalar-provider","p":239},{"i":248,"t":"Property level ScalarProvider","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#property-level-scalarprovider","p":239},{"i":250,"t":"Non-Spring registration","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#non-spring-registration","p":239},{"i":252,"t":"Spring registration","u":"/jimmer-doc/docs/configuration/scala-provider","h":"#spring-registration","p":239},{"i":261,"t":"Introduction to GraphQL Input","u":"/jimmer-doc/docs/graphql/mutation","h":"#introduction-to-graphql-input","p":260},{"i":263,"t":"Define Jimmer Input DTO","u":"/jimmer-doc/docs/graphql/mutation","h":"#define-jimmer-input-dto","p":260},{"i":265,"t":"Implement GraphQL mutation","u":"/jimmer-doc/docs/graphql/mutation","h":"#implement-graphql-mutation","p":260},{"i":269,"t":"Feature Description","u":"/jimmer-doc/docs/graphql/query","h":"#feature-description","p":268},{"i":271,"t":"Implement GraphQL Service","u":"/jimmer-doc/docs/graphql/query","h":"#implement-graphql-service","p":268},{"i":272,"t":"1. Simplest Implementation","u":"/jimmer-doc/docs/graphql/query","h":"#1-simplest-implementation","p":268},{"i":274,"t":"2. Optimize Performance","u":"/jimmer-doc/docs/graphql/query","h":"#2-optimize-performance","p":268},{"i":276,"t":"Running Effect","u":"/jimmer-doc/docs/graphql/query","h":"#running-effect","p":268},{"i":280,"t":"Map to String","u":"/jimmer-doc/docs/mapping/advanced/enum","h":"#map-to-string","p":278},{"i":282,"t":"Map to Integer","u":"/jimmer-doc/docs/mapping/advanced/enum","h":"#map-to-integer","p":278},{"i":284,"t":"Do Not Explicitly Use @EnumType","u":"/jimmer-doc/docs/mapping/advanced/enum","h":"#do-not-explicitly-use-enumtype","p":278},{"i":286,"t":"Work with TypeScript Client and Jackson","u":"/jimmer-doc/docs/mapping/advanced/enum","h":"#work-with-typescript-client-and-jackson","p":278},{"i":289,"t":"Non-Structural Design Example","u":"/jimmer-doc/docs/mapping/advanced/join-sql","h":"#non-structural-design-example","p":288},{"i":291,"t":"Non-Structural Association","u":"/jimmer-doc/docs/mapping/advanced/join-sql","h":"#non-structural-association","p":288},{"i":293,"t":"Precautions","u":"/jimmer-doc/docs/mapping/advanced/join-sql","h":"#precautions","p":288},{"i":297,"t":"1. Java/Kotlin-based Calculation","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#1-javakotlin-based-calculation","p":295},{"i":298,"t":"Depending on simple properties","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#depending-on-simple-properties","p":295},{"i":300,"t":"Depending on embedded object","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#depending-on-embedded-object","p":295},{"i":302,"t":"Depending on association properties","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#depending-on-association-properties","p":295},{"i":304,"t":"2. SQL-based Calculation","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#2-sql-based-calculation","p":295},{"i":306,"t":"Comparison","u":"/jimmer-doc/docs/mapping/advanced/calculated/formula","h":"#comparison","p":295},{"i":310,"t":"Global JSON Mapping","u":"/jimmer-doc/docs/mapping/advanced/json","h":"#global-json-mapping","p":308},{"i":312,"t":"Property-level JSON Mapping","u":"/jimmer-doc/docs/mapping/advanced/json","h":"#property-level-json-mapping","p":308},{"i":314,"t":"ObjectMapper Configuration","u":"/jimmer-doc/docs/mapping/advanced/json","h":"#objectmapper-configuration","p":308},{"i":315,"t":"Use Low-level API","u":"/jimmer-doc/docs/mapping/advanced/json","h":"#use-low-level-api","p":308},{"i":317,"t":"Use Spring Boot Starter","u":"/jimmer-doc/docs/mapping/advanced/json","h":"#use-spring-boot-starter","p":308},{"i":321,"t":"As Ordinary Field","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#as-ordinary-field","p":319},{"i":322,"t":"Basic Usage","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#basic-usage","p":319},{"i":324,"t":"Override Column Names","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#override-column-names","p":319},{"i":326,"t":"As Primary/Foreign Keys","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#as-primaryforeign-keys","p":319},{"i":328,"t":"As Primary Key","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#as-primary-key","p":319},{"i":330,"t":"Referenced by @JoinColumn","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#referenced-by-joincolumn","p":319},{"i":332,"t":"Referenced by @JoinTable","u":"/jimmer-doc/docs/mapping/advanced/embedded","h":"#referenced-by-jointable","p":319},{"i":337,"t":"Concept","u":"/jimmer-doc/docs/mapping/advanced/key","h":"#concept","p":336},{"i":339,"t":"Multi-version support","u":"/jimmer-doc/docs/mapping/advanced/key","h":"#multi-version-support","p":336},{"i":341,"t":"Dynamic Overrides","u":"/jimmer-doc/docs/mapping/advanced/key","h":"#dynamic-overrides","p":336},{"i":345,"t":"Usage","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/entity","h":"#usage","p":343},{"i":347,"t":"Multi-Version Data","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/entity","h":"#multi-version-data","p":343},{"i":349,"t":"Effects on Middle Tables","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/entity","h":"#effects-on-middle-tables","p":343},{"i":352,"t":"Basic Usage","u":"/jimmer-doc/docs/mapping/advanced/mapped-super-class","h":"#basic-usage","p":351},{"i":354,"t":"Multiple Inheritance","u":"/jimmer-doc/docs/mapping/advanced/mapped-super-class","h":"#multiple-inheritance","p":351},{"i":357,"t":"Concepts","u":"/jimmer-doc/docs/mapping/advanced/on-dissociate","h":"#concepts","p":356},{"i":359,"t":"Dissociation Modes","u":"/jimmer-doc/docs/mapping/advanced/on-dissociate","h":"#dissociation-modes","p":356},{"i":361,"t":"Dynamic Overrides","u":"/jimmer-doc/docs/mapping/advanced/on-dissociate","h":"#dynamic-overrides","p":356},{"i":365,"t":"@Entity","u":"/jimmer-doc/docs/mapping/advanced/remote","h":"#entity","p":363},{"i":367,"t":"@MappedSuperclass","u":"/jimmer-doc/docs/mapping/advanced/remote","h":"#mappedsuperclass","p":363},{"i":373,"t":"Usage","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/join-table","h":"#usage","p":371},{"i":375,"t":"Multi-Version Data","u":"/jimmer-doc/docs/mapping/advanced/logical-deleted/join-table","h":"#multi-version-data","p":371},{"i":378,"t":"Limitations of classic ORM associations","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#limitations-of-classic-orm-associations","p":377},{"i":380,"t":"Undisputed many-to-many association","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#undisputed-many-to-many-association","p":377},{"i":382,"t":"Undisputed double many-to-one association","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#undisputed-double-many-to-one-association","p":377},{"i":384,"t":"The controversial, tangled scenario","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#the-controversial-tangled-scenario","p":377},{"i":386,"t":"Getting Started with ManyToManyView","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#getting-started-with-manytomanyview","p":377},{"i":388,"t":"Basic relationship mapping","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#basic-relationship-mapping","p":377},{"i":390,"t":"Using @ManyToManyView","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#using-manytomanyview","p":377},{"i":392,"t":"The essence of @ManyToManyView","u":"/jimmer-doc/docs/mapping/advanced/view/many-to-many-view","h":"#the-essence-of-manytomanyview","p":377},{"i":400,"t":"Owning Side","u":"/jimmer-doc/docs/mapping/base/association/many-to-many","h":"#owning-side","p":398},{"i":402,"t":"Inverse Side","u":"/jimmer-doc/docs/mapping/base/association/many-to-many","h":"#inverse-side","p":398},{"i":404,"t":"If business fields need to be added to the join table","u":"/jimmer-doc/docs/mapping/base/association/many-to-many","h":"#if-business-fields-need-to-be-added-to-the-join-table","p":398},{"i":408,"t":"1. Based on Foreign Key","u":"/jimmer-doc/docs/mapping/base/association/many-to-one","h":"#1-based-on-foreign-key","p":406},{"i":410,"t":"2. Based on Join Table","u":"/jimmer-doc/docs/mapping/base/association/many-to-one","h":"#2-based-on-join-table","p":406},{"i":416,"t":"Owning Side","u":"/jimmer-doc/docs/mapping/base/association/one-to-one","h":"#owning-side","p":414},{"i":418,"t":"1. Based on Foreign Key","u":"/jimmer-doc/docs/mapping/base/association/one-to-one","h":"#1-based-on-foreign-key","p":414},{"i":420,"t":"2. Based on Join Table","u":"/jimmer-doc/docs/mapping/base/association/one-to-one","h":"#2-based-on-join-table","p":414},{"i":422,"t":"Inverse Side","u":"/jimmer-doc/docs/mapping/base/association/one-to-one","h":"#inverse-side","p":414},{"i":425,"t":"Basic Concepts: Short Associations","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#basic-concepts-short-associations","p":424},{"i":427,"t":"Book Form","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"","p":424},{"i":429,"t":"Microsoft's Solution","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#microsofts-solution","p":424},{"i":431,"t":"IdView Property","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#idview-property","p":424},{"i":432,"t":"Declaring View Properties","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#declaring-view-properties","p":424},{"i":434,"t":"Essence of View Properties","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#essence-of-view-properties","p":424},{"i":436,"t":"Fetching IdView Properties","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#fetching-idview-properties","p":424},{"i":438,"t":"Do Not Abuse","u":"/jimmer-doc/docs/mapping/advanced/view/id-view","h":"#do-not-abuse","p":424},{"i":441,"t":"@Entity","u":"/jimmer-doc/docs/mapping/base/basic","h":"#entity","p":440},{"i":443,"t":"@Table","u":"/jimmer-doc/docs/mapping/base/basic","h":"#table","p":440},{"i":445,"t":"@Column","u":"/jimmer-doc/docs/mapping/base/basic","h":"#column","p":440},{"i":447,"t":"@Id","u":"/jimmer-doc/docs/mapping/base/basic","h":"#id","p":440},{"i":449,"t":"@GeneratedValue","u":"/jimmer-doc/docs/mapping/base/basic","h":"#generatedvalue","p":440},{"i":451,"t":"Database autoincrement","u":"/jimmer-doc/docs/mapping/base/basic","h":"#database-autoincrement","p":440},{"i":453,"t":"Database sequence","u":"/jimmer-doc/docs/mapping/base/basic","h":"#database-sequence","p":440},{"i":455,"t":"UUID","u":"/jimmer-doc/docs/mapping/base/basic","h":"#uuid","p":440},{"i":457,"t":"Custom IdGenerator","u":"/jimmer-doc/docs/mapping/base/basic","h":"#custom-idgenerator","p":440},{"i":460,"t":"Two Scenarios","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#two-scenarios","p":459},{"i":462,"t":"1. Multiple associations between same entity types","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#1-multiple-associations-between-same-entity-types","p":459},{"i":464,"t":"2. Multiple associations between different entity types","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#2-multiple-associations-between-different-entity-types","p":459},{"i":466,"t":"Mixing One-to-Many and Many-to-Many","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#mixing-one-to-many-and-many-to-many","p":459},{"i":468,"t":"Define Associations","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#define-associations","p":459},{"i":470,"t":"Conditional Indexes","u":"/jimmer-doc/docs/mapping/advanced/join-table-filter","h":"#conditional-indexes","p":459},{"i":474,"t":"Explicitly specify real foreign key","u":"/jimmer-doc/docs/mapping/base/foreignkey","h":"#explicitly-specify-real-foreign-key","p":472},{"i":476,"t":"Explicitly specify fake foreign key","u":"/jimmer-doc/docs/mapping/base/foreignkey","h":"#explicitly-specify-fake-foreign-key","p":472},{"i":478,"t":"Do not explicitly specify the authenticity of foreign keys","u":"/jimmer-doc/docs/mapping/base/foreignkey","h":"#do-not-explicitly-specify-the-authenticity-of-foreign-keys","p":472},{"i":481,"t":"Naming Strategy Interface","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#naming-strategy-interface","p":480},{"i":483,"t":"Default Naming Strategy","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#default-naming-strategy","p":480},{"i":485,"t":"UPPER_CASE","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#upper_case","p":480},{"i":487,"t":"LOWER_CASE","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#lower_case","p":480},{"i":489,"t":"Override Strategy","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#override-strategy","p":480},{"i":491,"t":"When using SpringBoot","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#when-using-springboot","p":480},{"i":493,"t":"When not using SpringBoot","u":"/jimmer-doc/docs/mapping/base/naming-strategy","h":"#when-not-using-springboot","p":480},{"i":497,"t":"Array Types","u":"/jimmer-doc/docs/mapping/base/more-type","h":"#array-types","p":495},{"i":499,"t":"JSON Types","u":"/jimmer-doc/docs/mapping/base/more-type","h":"#json-types","p":495},{"i":501,"t":"Custom Types","u":"/jimmer-doc/docs/mapping/base/more-type","h":"#custom-types","p":495},{"i":505,"t":"Define nullity of properties","u":"/jimmer-doc/docs/mapping/base/nullity","h":"#define-nullity-of-properties","p":503},{"i":506,"t":"Kotlin","u":"/jimmer-doc/docs/mapping/base/nullity","h":"#kotlin","p":503},{"i":508,"t":"Java","u":"/jimmer-doc/docs/mapping/base/nullity","h":"#java","p":503},{"i":510,"t":"Precautions","u":"/jimmer-doc/docs/mapping/base/nullity","h":"#precautions","p":503},{"i":512,"t":"inputNotNull","u":"/jimmer-doc/docs/mapping/base/nullity","h":"#inputnotnull","p":503},{"i":517,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/delete-command","h":"#basic-concepts","p":516},{"i":519,"t":"Logical Delete","u":"/jimmer-doc/docs/mutation/delete-command","h":"#logical-delete","p":516},{"i":521,"t":"Physical Delete","u":"/jimmer-doc/docs/mutation/delete-command","h":"#physical-delete","p":516},{"i":523,"t":"Basic Usage","u":"/jimmer-doc/docs/mutation/delete-command","h":"#basic-usage","p":516},{"i":525,"t":"Dissociate Mode","u":"/jimmer-doc/docs/mutation/delete-command","h":"#dissociate-mode","p":516},{"i":527,"t":"Dissociation Examples","u":"/jimmer-doc/docs/mutation/delete-command","h":"#dissociation-examples","p":516},{"i":531,"t":"1. Snowflake ID","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#1-snowflake-id","p":529},{"i":533,"t":"Usage","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#usage","p":529},{"i":535,"t":"Automatically Applied to IdView Properties","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#automatically-applied-to-idview-properties","p":529},{"i":537,"t":"Automatically Applied to DTO","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#automatically-applied-to-dto","p":529},{"i":539,"t":"2. Data Masking","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#2-data-masking","p":529},{"i":540,"t":"Usage","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#usage-1","p":529},{"i":542,"t":"Support Input","u":"/jimmer-doc/docs/mapping/base/json-converter","h":"#support-input","p":529},{"i":545,"t":"Basic Usage","u":"/jimmer-doc/docs/mutation/delete-statement","h":"#basic-usage","p":544},{"i":547,"t":"Using JOIN","u":"/jimmer-doc/docs/mutation/delete-statement","h":"#using-join","p":544},{"i":552,"t":"Concept","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#concept","p":551},{"i":554,"t":"Define Intercepted Data Format","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#define-intercepted-data-format","p":551},{"i":556,"t":"Define Interceptor","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#define-interceptor","p":551},{"i":558,"t":"Controlling the format of the original parameter","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#controlling-the-format-of-the-original-parameter","p":551},{"i":560,"t":"Apply interceptor","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#apply-interceptor","p":551},{"i":561,"t":"Using Jimmer Spring Starter","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#using-jimmer-spring-starter","p":551},{"i":563,"t":"Not Using Jimmer Spring Starter","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#not-using-jimmer-spring-starter","p":551},{"i":565,"t":"Final Usage","u":"/jimmer-doc/docs/mutation/draft-interceptor","h":"#final-usage","p":551},{"i":569,"t":"Overview","u":"/jimmer-doc/docs/mutation/associations","h":"#overview","p":568},{"i":571,"t":"Insert Association","u":"/jimmer-doc/docs/mutation/associations","h":"#insert-association","p":568},{"i":573,"t":"Reverse Conversion","u":"/jimmer-doc/docs/mutation/associations","h":"#reverse-conversion","p":568},{"i":575,"t":"Bulk Insert","u":"/jimmer-doc/docs/mutation/associations","h":"#bulk-insert","p":568},{"i":577,"t":"Check Existence","u":"/jimmer-doc/docs/mutation/associations","h":"#check-existence","p":568},{"i":579,"t":"Delete Association","u":"/jimmer-doc/docs/mutation/associations","h":"#delete-association","p":568},{"i":581,"t":"Bulk Delete","u":"/jimmer-doc/docs/mutation/associations","h":"#bulk-delete","p":568},{"i":583,"t":"Notes","u":"/jimmer-doc/docs/mutation/associations","h":"#notes","p":568},{"i":586,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#basic-concepts","p":585},{"i":588,"t":"Two Configuration Methods","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#two-configuration-methods","p":585},{"i":590,"t":"1. APPEND","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#1-append","p":585},{"i":592,"t":"2. MERGE","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#2-merge","p":585},{"i":594,"t":"3. REPLACE","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#3-replace","p":585},{"i":596,"t":"Summary","u":"/jimmer-doc/docs/mutation/save-command/associated-save-mode","h":"#summary","p":585},{"i":599,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#basic-concepts","p":598},{"i":601,"t":"1. Classification by Association Object Shape","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#1-classification-by-association-object-shape","p":598},{"i":602,"t":"1.1. Short Association","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#11-short-association","p":598},{"i":604,"t":"Book Form","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"","p":598},{"i":606,"t":"1.2. Long Association","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#12-long-association","p":598},{"i":608,"t":"2. Classification by Save Order","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#2-classification-by-save-order","p":598},{"i":609,"t":"2.1. Forward Association","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#21-forward-association","p":598},{"i":611,"t":"2.2. Backward Association","u":"/jimmer-doc/docs/mutation/save-command/association/classification","h":"#22-backward-association","p":598},{"i":614,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/save-command/association/owner","h":"#basic-concepts","p":613},{"i":616,"t":"1. Automatically Setting Reverse Associations for Child Objects","u":"/jimmer-doc/docs/mutation/save-command/association/owner","h":"#1-automatically-setting-reverse-associations-for-child-objects","p":613},{"i":618,"t":"2. Configuring Whether Different Parent Objects Can Snatch for Child Objects","u":"/jimmer-doc/docs/mutation/save-command/association/owner","h":"#2-configuring-whether-different-parent-objects-can-snatch-for-child-objects","p":613},{"i":619,"t":"Conservative Default Behavior","u":"/jimmer-doc/docs/mutation/save-command/association/owner","h":"#conservative-default-behavior","p":613},{"i":621,"t":"Overriding Default Behavior Without Restrictions","u":"/jimmer-doc/docs/mutation/save-command/association/owner","h":"#overriding-default-behavior-without-restrictions","p":613},{"i":624,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#basic-concepts","p":623},{"i":625,"t":"For Short Associations Only","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#for-short-associations-only","p":623},{"i":627,"t":"Concept Definition: Target Foreign Key","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#concept-definition-target-foreign-key","p":623},{"i":629,"t":"Checking Mechanism","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#checking-mechanism","p":623},{"i":631,"t":"Configuration","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#configuration","p":623},{"i":633,"t":"Global Configuration","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#global-configuration","p":623},{"i":635,"t":"Command-Level Configuration","u":"/jimmer-doc/docs/mutation/save-command/id-checking","h":"#command-level-configuration","p":623},{"i":639,"t":"JPA Example","u":"/jimmer-doc/docs/mutation/save-command/incomplete","h":"#jpa-example","p":637},{"i":641,"t":"Jimmer Example","u":"/jimmer-doc/docs/mutation/save-command/incomplete","h":"#jimmer-example","p":637},{"i":645,"t":"Entity Definition","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#entity-definition","p":643},{"i":647,"t":"1. Wild Objects","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#1-wild-objects","p":643},{"i":649,"t":"2. Id-specified Objects","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#2-id-specified-objects","p":643},{"i":651,"t":"3. Key-specified Objects","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#3-key-specified-objects","p":643},{"i":653,"t":"4. Id-only Objects","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#4-id-only-objects","p":643},{"i":655,"t":"5. Key-only Objects","u":"/jimmer-doc/docs/mutation/save-command/data-classification","h":"#5-key-only-objects","p":643},{"i":663,"t":"Concept","u":"/jimmer-doc/docs/mutation/save-command/dissociation","h":"#concept","p":661},{"i":665,"t":"Dissociating Middle Table Data","u":"/jimmer-doc/docs/mutation/save-command/dissociation","h":"#dissociating-middle-table-data","p":661},{"i":667,"t":"Dissociating Child Table Data","u":"/jimmer-doc/docs/mutation/save-command/dissociation","h":"#dissociating-child-table-data","p":661},{"i":669,"t":"Dissociation Modes","u":"/jimmer-doc/docs/mutation/save-command/dissociation","h":"#dissociation-modes","p":661},{"i":671,"t":"Example","u":"/jimmer-doc/docs/mutation/save-command/dissociation","h":"#example","p":661},{"i":675,"t":"Define Input DTO","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","h":"#define-input-dto","p":673},{"i":677,"t":"MapStruct Converter","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","h":"#mapstruct-converter","p":673},{"i":679,"t":"HTTP API","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","h":"#http-api","p":673},{"i":681,"t":"Improvement","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","h":"#improvement","p":673},{"i":683,"t":"Best Practices","u":"/jimmer-doc/docs/mutation/save-command/input-dto/mapstruct","h":"#best-practices","p":673},{"i":687,"t":"Defining DTO Shape","u":"/jimmer-doc/docs/mutation/save-command/input-dto/dto-lang","h":"#defining-dto-shape","p":685},{"i":689,"t":"Auto-Generated DTO Types","u":"/jimmer-doc/docs/mutation/save-command/input-dto/dto-lang","h":"#auto-generated-dto-types","p":685},{"i":691,"t":"HTTP API","u":"/jimmer-doc/docs/mutation/save-command/input-dto/dto-lang","h":"#http-api","p":685},{"i":693,"t":"Best Practices","u":"/jimmer-doc/docs/mutation/save-command/input-dto/dto-lang","h":"#best-practices","p":685},{"i":697,"t":"Problem of Dynamic Entities Parameters","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","h":"#problem-of-dynamic-entities-parameters","p":695},{"i":699,"t":"Security Issue","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","h":"#security-issue","p":695},{"i":701,"t":"API Ambiguity","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","h":"#api-ambiguity","p":695},{"i":703,"t":"Solutions","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","h":"#solutions","p":695},{"i":705,"t":"Comparison with GraphQLInput","u":"/jimmer-doc/docs/mutation/save-command/input-dto/problem","h":"#comparison-with-graphqlinput","p":695},{"i":708,"t":"Save Command Result","u":"/jimmer-doc/docs/mutation/save-command/other","h":"#save-command-result","p":707},{"i":712,"t":"Optimistic Lock","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#optimistic-lock","p":710},{"i":714,"t":"Modify Entity Types","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#modify-entity-types","p":710},{"i":716,"t":"Demo","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#demo","p":710},{"i":718,"t":"Pessimistic Lock","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#pessimistic-lock","p":710},{"i":720,"t":"Without Pessimistic Lock","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#without-pessimistic-lock","p":710},{"i":722,"t":"Enabling Pessimistic Lock","u":"/jimmer-doc/docs/mutation/save-command/lock","h":"#enabling-pessimistic-lock","p":710},{"i":726,"t":"Null-related Issues in Data input","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#null-related-issues-in-data-input","p":724},{"i":727,"t":"Review: Directly Saving Entity Objects","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#review-directly-saving-entity-objects","p":724},{"i":729,"t":"Issues Faced by Input DTO","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#issues-faced-by-input-dto","p":724},{"i":731,"t":"4 Ways to Handle Nullable Properties","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#4-ways-to-handle-nullable-properties","p":724},{"i":733,"t":"1. fixed","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#1-fixed","p":724},{"i":735,"t":"2. static","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#2-static","p":724},{"i":737,"t":"3. dynamic","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#3-dynamic","p":724},{"i":739,"t":"4. fuzzy","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#4-fuzzy","p":724},{"i":741,"t":"Higher-Level Configurations","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#higher-level-configurations","p":724},{"i":743,"t":"Caveats","u":"/jimmer-doc/docs/mutation/save-command/input-dto/null-handling","h":"#caveats","p":724},{"i":746,"t":"Save Modes","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#save-modes","p":745},{"i":748,"t":"1. INSERT_ONLY","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#1-insert_only","p":745},{"i":750,"t":"2. UPDATE_ONLY","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#2-update_only","p":745},{"i":752,"t":"Updating Data by ID","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#updating-data-by-id","p":745},{"i":754,"t":"Updating Data by Key","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#updating-data-by-key","p":745},{"i":756,"t":"3. UPSERT","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#3-upsert","p":745},{"i":758,"t":"Determining Data Existence by Id","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#determining-data-existence-by-id","p":745},{"i":760,"t":"Determining Data Existence by Key","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#determining-data-existence-by-key","p":745},{"i":762,"t":"Improved Key-based Determination","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#improved-key-based-determination","p":745},{"i":764,"t":"4. INSERT_IF_ABSENT","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#4-insert_if_absent","p":745},{"i":766,"t":"Check Data Existence by Id","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#check-data-existence-by-id","p":745},{"i":768,"t":"Check Data Existence by Key","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#check-data-existence-by-key","p":745},{"i":770,"t":"5. NON_IDEMPOTENT_UPSERT","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#5-non_idempotent_upsert","p":745},{"i":772,"t":"Various Save Methods","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#various-save-methods","p":745},{"i":774,"t":"Batch Saving Objects of Different Formats","u":"/jimmer-doc/docs/mutation/save-command/save-mode","h":"#batch-saving-objects-of-different-formats","p":745},{"i":777,"t":"Basic Usage","u":"/jimmer-doc/docs/mutation/update-statement","h":"#basic-usage","p":776},{"i":779,"t":"Using JOIN","u":"/jimmer-doc/docs/mutation/update-statement","h":"#using-join","p":776},{"i":781,"t":"MySQL","u":"/jimmer-doc/docs/mutation/update-statement","h":"#mysql","p":776},{"i":783,"t":"Postgres","u":"/jimmer-doc/docs/mutation/update-statement","h":"#postgres","p":776},{"i":786,"t":"Introduction","u":"/jimmer-doc/docs/mutation/save-command/usage","h":"#introduction","p":785},{"i":788,"t":"Basic Concepts","u":"/jimmer-doc/docs/mutation/save-command/usage","h":"#basic-concepts","p":785},{"i":790,"t":"APIs","u":"/jimmer-doc/docs/mutation/save-command/usage","h":"#apis","p":785},{"i":792,"t":"Important Concepts: Full Replacement vs Incremental Change","u":"/jimmer-doc/docs/mutation/save-command/usage","h":"#important-concepts-full-replacement-vs-incremental-change","p":785},{"i":794,"t":"Q & A","u":"/jimmer-doc/docs/mutation/save-command/usage","h":"#q--a","p":785},{"i":797,"t":"@Transient Annotation","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#transient-annotation","p":796},{"i":799,"t":"Scalar Calculation: BookStore.avgPrice","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#scalar-calculation-bookstoreavgprice","p":796},{"i":801,"t":"Define Resolver for avgPrice","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#define-resolver-for-avgprice","p":796},{"i":803,"t":"Implement Resolver for avgPrice","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#implement-resolver-for-avgprice","p":796},{"i":805,"t":"Define avgPrice","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#define-avgprice","p":796},{"i":807,"t":"Fetch avgPrice","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#fetch-avgprice","p":796},{"i":809,"t":"Associative Calculation: BookStore.newestBooks","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#associative-calculation-bookstorenewestbooks","p":796},{"i":810,"t":"Clarify Requirements","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#clarify-requirements","p":796},{"i":812,"t":"Define Resolver for newestBooks","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#define-resolver-for-newestbooks","p":796},{"i":814,"t":"Implement Resolver for newestBooks","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#implement-resolver-for-newestbooks","p":796},{"i":816,"t":"Define newestBooks","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#define-newestbooks","p":796},{"i":818,"t":"Fetch newestBooks","u":"/jimmer-doc/docs/mapping/advanced/calculated/transient","h":"#fetch-newestbooks","p":796},{"i":828,"t":"Motivation","u":"/jimmer-doc/docs/object/immutable/reason","h":"#motivation","p":826},{"i":829,"t":"Forbid Circular References","u":"/jimmer-doc/docs/object/immutable/reason","h":"#forbid-circular-references","p":826},{"i":831,"t":"Incorrect Demo","u":"/jimmer-doc/docs/object/immutable/reason","h":"#incorrect-demo","p":826},{"i":833,"t":"Other benefits","u":"/jimmer-doc/docs/object/immutable/reason","h":"#other-benefits","p":826},{"i":837,"t":"Basic Concepts","u":"/jimmer-doc/docs/object/dynamic","h":"#basic-concepts","p":835},{"i":838,"t":"1. A few properties","u":"/jimmer-doc/docs/object/dynamic","h":"#1-a-few-properties","p":835},{"i":840,"t":"2. More Properties","u":"/jimmer-doc/docs/object/dynamic","h":"#2-more-properties","p":835},{"i":842,"t":"3. Include Association","u":"/jimmer-doc/docs/object/dynamic","h":"#3-include-association","p":835},{"i":844,"t":"4. More Associations (Larger Breadth)","u":"/jimmer-doc/docs/object/dynamic","h":"#4-more-associations-larger-breadth","p":835},{"i":846,"t":"5. Deeper Associations (Larger Depth)","u":"/jimmer-doc/docs/object/dynamic","h":"#5-deeper-associations-larger-depth","p":835},{"i":848,"t":"Characteristics of Dynamic Objects","u":"/jimmer-doc/docs/object/dynamic","h":"#characteristics-of-dynamic-objects","p":835},{"i":850,"t":"Interaction with ORM","u":"/jimmer-doc/docs/object/dynamic","h":"#interaction-with-orm","p":835},{"i":852,"t":"Object Fetchers","u":"/jimmer-doc/docs/object/dynamic","h":"#object-fetchers","p":835},{"i":854,"t":"Save Commands","u":"/jimmer-doc/docs/object/dynamic","h":"#save-commands","p":835},{"i":858,"t":"1. Define immutable type","u":"/jimmer-doc/docs/object/immutable/solution","h":"#1-define-immutable-type","p":856},{"i":860,"t":"2. Create data structure from scratch","u":"/jimmer-doc/docs/object/immutable/solution","h":"#2-create-data-structure-from-scratch","p":856},{"i":862,"t":"3. Create new data based on existing data","u":"/jimmer-doc/docs/object/immutable/solution","h":"#3-create-new-data-based-on-existing-data","p":856},{"i":868,"t":"Trigger Types","u":"/jimmer-doc/docs/mutation/trigger","h":"#trigger-types","p":866},{"i":869,"t":"Trigger Classification","u":"/jimmer-doc/docs/mutation/trigger","h":"#trigger-classification","p":866},{"i":871,"t":"Recommended Usage","u":"/jimmer-doc/docs/mutation/trigger","h":"#recommended-usage","p":866},{"i":873,"t":"Setting Trigger Type","u":"/jimmer-doc/docs/mutation/trigger","h":"#setting-trigger-type","p":866},{"i":874,"t":"Concept","u":"/jimmer-doc/docs/mutation/trigger","h":"#concept","p":866},{"i":876,"t":"Q & A","u":"/jimmer-doc/docs/mutation/trigger","h":"#q--a","p":866},{"i":878,"t":"Using Jimmer Spring Boot Starter","u":"/jimmer-doc/docs/mutation/trigger","h":"#using-jimmer-spring-boot-starter","p":866},{"i":880,"t":"Not Using Jimmer Spring Boot Starter","u":"/jimmer-doc/docs/mutation/trigger","h":"#not-using-jimmer-spring-boot-starter","p":866},{"i":882,"t":"BinLog Trigger Development Work","u":"/jimmer-doc/docs/mutation/trigger","h":"#binlog-trigger-development-work","p":866},{"i":884,"t":"Create External Environment","u":"/jimmer-doc/docs/mutation/trigger","h":"#create-external-environment","p":866},{"i":886,"t":"Listen to Message Queue","u":"/jimmer-doc/docs/mutation/trigger","h":"#listen-to-message-queue","p":866},{"i":888,"t":"Usage Examples","u":"/jimmer-doc/docs/mutation/trigger","h":"#usage-examples","p":866},{"i":890,"t":"Register Handler Logic","u":"/jimmer-doc/docs/mutation/trigger","h":"#register-handler-logic","p":866},{"i":892,"t":"Experience Triggers","u":"/jimmer-doc/docs/mutation/trigger","h":"#experience-triggers","p":866},{"i":896,"t":"Operating on Immutable Objects","u":"/jimmer-doc/docs/object/tool","h":"#operating-on-immutable-objects","p":894},{"i":897,"t":"isLoaded","u":"/jimmer-doc/docs/object/tool","h":"#isloaded","p":894},{"i":899,"t":"get","u":"/jimmer-doc/docs/object/tool","h":"#get","p":894},{"i":901,"t":"isIdOnly","u":"/jimmer-doc/docs/object/tool","h":"#isidonly","p":894},{"i":903,"t":"makeIdOnly","u":"/jimmer-doc/docs/object/tool","h":"#makeidonly","p":894},{"i":905,"t":"isLonely","u":"/jimmer-doc/docs/object/tool","h":"#islonely","p":894},{"i":907,"t":"toLonely","u":"/jimmer-doc/docs/object/tool","h":"#tolonely","p":894},{"i":909,"t":"toIdOnly","u":"/jimmer-doc/docs/object/tool","h":"#toidonly","p":894},{"i":911,"t":"fromString","u":"/jimmer-doc/docs/object/tool","h":"#fromstring","p":894},{"i":913,"t":"Operating on Mutable Drafts","u":"/jimmer-doc/docs/object/tool","h":"#operating-on-mutable-drafts","p":894},{"i":914,"t":"set","u":"/jimmer-doc/docs/object/tool","h":"#set","p":894},{"i":916,"t":"unload","u":"/jimmer-doc/docs/object/tool","h":"#unload","p":894},{"i":918,"t":"show","u":"/jimmer-doc/docs/object/tool","h":"#show","p":894},{"i":920,"t":"hide","u":"/jimmer-doc/docs/object/tool","h":"#hide","p":894},{"i":924,"t":"Entangled Properties","u":"/jimmer-doc/docs/object/visibility","h":"#entangled-properties","p":922},{"i":926,"t":"Object Fetchers and Entangled Properties","u":"/jimmer-doc/docs/object/visibility","h":"#object-fetchers-and-entangled-properties","p":922},{"i":928,"t":"Property Visibility","u":"/jimmer-doc/docs/object/visibility","h":"#property-visibility","p":922},{"i":935,"t":"Basic Concepts","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#basic-concepts","p":934},{"i":937,"t":"How to Use","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#how-to-use","p":934},{"i":939,"t":"Where to Use","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#where-to-use","p":934},{"i":941,"t":"Notes","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#notes","p":934},{"i":943,"t":"Two Styles of Java Code","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#two-styles-of-java-code","p":934},{"i":945,"t":"Integration with Lombok","u":"/jimmer-doc/docs/overview/apt-ksp","h":"#integration-with-lombok","p":934},{"i":948,"t":"Introduction","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#introduction","p":947},{"i":950,"t":"Notes","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#notes","p":947},{"i":952,"t":"Advantages","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#advantages","p":947},{"i":954,"t":"Disadvantages","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#disadvantages","p":947},{"i":956,"t":"Dependencies and Preprocessors","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#dependencies-and-preprocessors","p":947},{"i":958,"t":"Define POJO","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#define-pojo","p":947},{"i":960,"t":"Define Mapper","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#define-mapper","p":947},{"i":962,"t":"If the entity defines @IdView properties","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#if-the-entity-defines-idview-properties","p":947},{"i":964,"t":"If the entity does not define @IdView properties","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#if-the-entity-does-not-define-idview-properties","p":947},{"i":966,"t":"Usage","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#usage","p":947},{"i":968,"t":"Make POJO implement Input interface","u":"/jimmer-doc/docs/object/view/mapstruct","h":"#make-pojo-implement-input-interface","p":947},{"i":972,"t":"Report","u":"/jimmer-doc/docs/overview/benchmark","h":"#report","p":970},{"i":973,"t":"Operations Per Second","u":"/jimmer-doc/docs/overview/benchmark","h":"#operations-per-second","p":970},{"i":975,"t":"Operation Time","u":"/jimmer-doc/docs/overview/benchmark","h":"#operation-time","p":970},{"i":977,"t":"Implementation Principles","u":"/jimmer-doc/docs/overview/benchmark","h":"#implementation-principles","p":970},{"i":979,"t":"Value","u":"/jimmer-doc/docs/overview/benchmark","h":"#value","p":970},{"i":981,"t":"Why so fast?","u":"/jimmer-doc/docs/overview/benchmark","h":"#why-so-fast","p":970},{"i":984,"t":"1. Concepts","u":"/jimmer-doc/docs/object/view/dto-language","h":"#1-concepts","p":983},{"i":985,"t":"1.1. Pain Point","u":"/jimmer-doc/docs/object/view/dto-language","h":"#11-pain-point","p":983},{"i":987,"t":"1.2. Solution","u":"/jimmer-doc/docs/object/view/dto-language","h":"#12-solution","p":983},{"i":989,"t":"1.3. Application Scenarios","u":"/jimmer-doc/docs/object/view/dto-language","h":"#13-application-scenarios","p":983},{"i":991,"t":"2. Create File","u":"/jimmer-doc/docs/object/view/dto-language","h":"#2-create-file","p":983},{"i":993,"t":"2.1. Two ways to create files","u":"/jimmer-doc/docs/object/view/dto-language","h":"#21-two-ways-to-create-files","p":983},{"i":995,"t":"2.2 Export statement","u":"/jimmer-doc/docs/object/view/dto-language","h":"#22-export-statement","p":983},{"i":997,"t":"2.3. Notes","u":"/jimmer-doc/docs/object/view/dto-language","h":"#23-notes","p":983},{"i":999,"t":"3. view, input and specification","u":"/jimmer-doc/docs/object/view/dto-language","h":"#3-view-input-and-specification","p":983},{"i":1001,"t":"3.1 Common functionalities of view and input","u":"/jimmer-doc/docs/object/view/dto-language","h":"#31-common-functionalities-of-view-and-input","p":983},{"i":1003,"t":"3.2 input-specific functionalities","u":"/jimmer-doc/docs/object/view/dto-language","h":"#32-input-specific-functionalities","p":983},{"i":1005,"t":"3.3 specification-specific functionalities","u":"/jimmer-doc/docs/object/view/dto-language","h":"#33-specification-specific-functionalities","p":983},{"i":1007,"t":"4. Simple properties","u":"/jimmer-doc/docs/object/view/dto-language","h":"#4-simple-properties","p":983},{"i":1009,"t":"5. allScalars","u":"/jimmer-doc/docs/object/view/dto-language","h":"#5-allscalars","p":983},{"i":1011,"t":"6. Negative Attributes","u":"/jimmer-doc/docs/object/view/dto-language","h":"#6-negative-attributes","p":983},{"i":1013,"t":"7. Nullability","u":"/jimmer-doc/docs/object/view/dto-language","h":"#7-nullability","p":983},{"i":1015,"t":"7.1. ?","u":"/jimmer-doc/docs/object/view/dto-language","h":"#71-","p":983},{"i":1017,"t":"7.2. !","u":"/jimmer-doc/docs/object/view/dto-language","h":"#72-","p":983},{"i":1019,"t":"8. Renaming","u":"/jimmer-doc/docs/object/view/dto-language","h":"#8-renaming","p":983},{"i":1021,"t":"8.1. Renaming a single property","u":"/jimmer-doc/docs/object/view/dto-language","h":"#81-renaming-a-single-property","p":983},{"i":1023,"t":"8.2. Renaming multiple properties","u":"/jimmer-doc/docs/object/view/dto-language","h":"#82-renaming-multiple-properties","p":983},{"i":1025,"t":"9. Enum Mapping","u":"/jimmer-doc/docs/object/view/dto-language","h":"#9-enum-mapping","p":983},{"i":1027,"t":"10. Association Attributes","u":"/jimmer-doc/docs/object/view/dto-language","h":"#10-association-attributes","p":983},{"i":1029,"t":"10.1. Ordinary Association","u":"/jimmer-doc/docs/object/view/dto-language","h":"#101-ordinary-association","p":983},{"i":1031,"t":"10.2 Recursive Association","u":"/jimmer-doc/docs/object/view/dto-language","h":"#102-recursive-association","p":983},{"i":1033,"t":"10.3. id Function","u":"/jimmer-doc/docs/object/view/dto-language","h":"#103-id-function","p":983},{"i":1035,"t":"10.4. flat Function","u":"/jimmer-doc/docs/object/view/dto-language","h":"#104-flat-function","p":983},{"i":1037,"t":"11. Custom Fields","u":"/jimmer-doc/docs/object/view/dto-language","h":"#11-custom-fields","p":983},{"i":1038,"t":"11.1 Introduction to Custom Fields","u":"/jimmer-doc/docs/object/view/dto-language","h":"#111-introduction-to-custom-fields","p":983},{"i":1040,"t":"11.2 Built-in Types","u":"/jimmer-doc/docs/object/view/dto-language","h":"#112-built-in-types","p":983},{"i":1042,"t":"11.3 Generic Parameter Modifiers","u":"/jimmer-doc/docs/object/view/dto-language","h":"#113-generic-parameter-modifiers","p":983},{"i":1044,"t":"11.4 Import Statements","u":"/jimmer-doc/docs/object/view/dto-language","h":"#114-import-statements","p":983},{"i":1046,"t":"12. Annotations","u":"/jimmer-doc/docs/object/view/dto-language","h":"#12-annotations","p":983},{"i":1047,"t":"12.1 Basic Usage","u":"/jimmer-doc/docs/object/view/dto-language","h":"#121-basic-usage","p":983},{"i":1049,"t":"12.2 Annotation Replacement","u":"/jimmer-doc/docs/object/view/dto-language","h":"#122-annotation-replacement","p":983},{"i":1051,"t":"12.3 value Parameter","u":"/jimmer-doc/docs/object/view/dto-language","h":"#123-value-parameter","p":983},{"i":1053,"t":"12.4 Mixing Java and Kotlin Syntax","u":"/jimmer-doc/docs/object/view/dto-language","h":"#124-mixing-java-and-kotlin-syntax","p":983},{"i":1055,"t":"13. Implementing Interfaces","u":"/jimmer-doc/docs/object/view/dto-language","h":"#13-implementing-interfaces","p":983},{"i":1057,"t":"12. Related Links","u":"/jimmer-doc/docs/object/view/dto-language","h":"#12-related-links","p":983},{"i":1060,"t":"Where are the Examples and Getting started?","u":"/jimmer-doc/docs/overview/welcome","h":"#where-are-the-examples-and-getting-started","p":1059},{"i":1062,"t":"About This Documentation","u":"/jimmer-doc/docs/overview/welcome","h":"#about-this-documentation","p":1059},{"i":1064,"t":"Discussion","u":"/jimmer-doc/docs/overview/welcome","h":"#discussion","p":1059},{"i":1068,"t":"Design Philosophy","u":"/jimmer-doc/docs/overview/key-features","h":"#design-philosophy","p":1066},{"i":1070,"t":"Key features","u":"/jimmer-doc/docs/overview/key-features","h":"#key-features","p":1066},{"i":1072,"t":"Notes","u":"/jimmer-doc/docs/overview/key-features","h":"#notes","p":1066},{"i":1080,"t":"Basic Concepts","u":"/jimmer-doc/docs/query/dynamic-join/chain-style","h":"#basic-concepts","p":1078},{"i":1082,"t":"Outer Joins","u":"/jimmer-doc/docs/query/dynamic-join/chain-style","h":"#outer-joins","p":1078},{"i":1086,"t":"Use preprocessor","u":"/jimmer-doc/docs/object/draft","h":"#use-preprocessor","p":1084},{"i":1087,"t":"Define TreeNode","u":"/jimmer-doc/docs/object/draft","h":"#define-treenode","p":1084},{"i":1089,"t":"Generate TreeNodeDraft","u":"/jimmer-doc/docs/object/draft","h":"#generate-treenodedraft","p":1084},{"i":1091,"t":"Scalar properties","u":"/jimmer-doc/docs/object/draft","h":"#scalar-properties","p":1084},{"i":1093,"t":"Reference associations","u":"/jimmer-doc/docs/object/draft","h":"#reference-associations","p":1084},{"i":1095,"t":"Override getter parent()","u":"/jimmer-doc/docs/object/draft","h":"#override-getter-parent","p":1084},{"i":1097,"t":"Add getter parent(boolean)","u":"/jimmer-doc/docs/object/draft","h":"#add-getter-parentboolean","p":1084},{"i":1099,"t":"Add setParent","u":"/jimmer-doc/docs/object/draft","h":"#add-setparent","p":1084},{"i":1101,"t":"Add lambda-based applyParent","u":"/jimmer-doc/docs/object/draft","h":"#add-lambda-based-applyparent","p":1084},{"i":1103,"t":"Collection associations","u":"/jimmer-doc/docs/object/draft","h":"#collection-associations","p":1084},{"i":1105,"t":"Inherit getter childNodes()","u":"/jimmer-doc/docs/object/draft","h":"#inherit-getter-childnodes","p":1084},{"i":1107,"t":"Add getter childNodes(boolean)","u":"/jimmer-doc/docs/object/draft","h":"#add-getter-childnodesboolean","p":1084},{"i":1109,"t":"Add setChildNodes","u":"/jimmer-doc/docs/object/draft","h":"#add-setchildnodes","p":1084},{"i":1111,"t":"Add addIntoChildNodes","u":"/jimmer-doc/docs/object/draft","h":"#add-addintochildnodes","p":1084},{"i":1114,"t":"Dilemma","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","h":"#dilemma","p":1113},{"i":1116,"t":"Getting Started with DSL's Null Safety","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","h":"#getting-started-with-dsls-null-safety","p":1113},{"i":1118,"t":"Null Safety in Table Joins","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","h":"#null-safety-in-table-joins","p":1113},{"i":1120,"t":"Inner Join","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","h":"#inner-join","p":1113},{"i":1122,"t":"Left Join","u":"/jimmer-doc/docs/query/dynamic-join/kotlin-join","h":"#left-join","p":1113},{"i":1125,"t":"Usage","u":"/jimmer-doc/docs/query/dynamic-join/merge","h":"#usage","p":1124},{"i":1127,"t":"Merge Rules","u":"/jimmer-doc/docs/query/dynamic-join/merge","h":"#merge-rules","p":1124},{"i":1131,"t":"Scene-1","u":"/jimmer-doc/docs/query/dynamic-join/problem","h":"#scene-1","p":1129},{"i":1133,"t":"Scene-2","u":"/jimmer-doc/docs/query/dynamic-join/problem","h":"#scene-2","p":1129},{"i":1136,"t":"Association Tables Hidden by Object Model","u":"/jimmer-doc/docs/query/associations","h":"#association-tables-hidden-by-object-model","p":1135},{"i":1138,"t":"Querying Association Tables Directly","u":"/jimmer-doc/docs/query/associations","h":"#querying-association-tables-directly","p":1135},{"i":1140,"t":"Comparison with Entity Table Queries","u":"/jimmer-doc/docs/query/associations","h":"#comparison-with-entity-table-queries","p":1135},{"i":1142,"t":"1. Use association table subquery to achieve a function","u":"/jimmer-doc/docs/query/associations","h":"#1-use-association-table-subquery-to-achieve-a-function","p":1135},{"i":1144,"t":"2. Achieve the same functionality with entity table subquery","u":"/jimmer-doc/docs/query/associations","h":"#2-achieve-the-same-functionality-with-entity-table-subquery","p":1135},{"i":1147,"t":"1. What is Jimmer","u":"/jimmer-doc/docs/overview/introduction","h":"#1-what-is-jimmer","p":1146},{"i":1149,"t":"2. ORM Part","u":"/jimmer-doc/docs/overview/introduction","h":"#2-orm-part","p":1146},{"i":1150,"t":"Existing Pain Points","u":"/jimmer-doc/docs/overview/introduction","h":"#existing-pain-points","p":1146},{"i":1152,"t":"Root Cause","u":"/jimmer-doc/docs/overview/introduction","h":"#root-cause","p":1146},{"i":1154,"t":"3. Complete Functionality","u":"/jimmer-doc/docs/overview/introduction","h":"#3-complete-functionality","p":1146},{"i":1156,"t":"3.1. Business Model","u":"/jimmer-doc/docs/overview/introduction","h":"#31-business-model","p":1146},{"i":1158,"t":"3.2. Fetcher","u":"/jimmer-doc/docs/overview/introduction","h":"#32-fetcher","p":1146},{"i":1160,"t":"3.3. Save Command","u":"/jimmer-doc/docs/overview/introduction","h":"#33-save-command","p":1146},{"i":1162,"t":"3.4. SQL DSL","u":"/jimmer-doc/docs/overview/introduction","h":"#34-sql-dsl","p":1146},{"i":1164,"t":"3.5 Trigger","u":"/jimmer-doc/docs/overview/introduction","h":"#35-trigger","p":1146},{"i":1166,"t":"3.6. Cache","u":"/jimmer-doc/docs/overview/introduction","h":"#36-cache","p":1146},{"i":1168,"t":"3.7. Global Filter","u":"/jimmer-doc/docs/overview/introduction","h":"#37-global-filter","p":1146},{"i":1170,"t":"3.8. Draft Interceptor","u":"/jimmer-doc/docs/overview/introduction","h":"#38-draft-interceptor","p":1146},{"i":1172,"t":"3.9. Logical Deletion","u":"/jimmer-doc/docs/overview/introduction","h":"#39-logical-deletion","p":1146},{"i":1174,"t":"3.10. Remote Associations","u":"/jimmer-doc/docs/overview/introduction","h":"#310-remote-associations","p":1146},{"i":1176,"t":"4. Ecosystem","u":"/jimmer-doc/docs/overview/introduction","h":"#4-ecosystem","p":1146},{"i":1178,"t":"5. Notes","u":"/jimmer-doc/docs/overview/introduction","h":"#5-notes","p":1146},{"i":1181,"t":"Static Ordering","u":"/jimmer-doc/docs/query/dynamic-order","h":"#static-ordering","p":1180},{"i":1184,"t":"orderByIf","u":"/jimmer-doc/docs/query/dynamic-order","h":"#orderbyif","p":1180},{"i":1186,"t":"Client-specified Ordering","u":"/jimmer-doc/docs/query/dynamic-order","h":"#client-specified-ordering","p":1180},{"i":1188,"t":"Handling Spring Data Sort","u":"/jimmer-doc/docs/query/dynamic-order","h":"#handling-spring-data-sort","p":1180},{"i":1191,"t":"Basic Usage","u":"/jimmer-doc/docs/query/dynamic-where","h":"#basic-usage","p":1190},{"i":1193,"t":"Notes for Java Developers","u":"/jimmer-doc/docs/query/dynamic-where","h":"#notes-for-java-developers","p":1190},{"i":1195,"t":"Multi-table Operations","u":"/jimmer-doc/docs/query/dynamic-where","h":"#multi-table-operations","p":1190},{"i":1198,"t":"The Problem to Solve","u":"/jimmer-doc/docs/query/dynamic-join/weak-join","h":"#the-problem-to-solve","p":1197},{"i":1200,"t":"Usage","u":"/jimmer-doc/docs/query/dynamic-join/weak-join","h":"#usage","p":1197},{"i":1201,"t":"Define Join Condition","u":"/jimmer-doc/docs/query/dynamic-join/weak-join","h":"#define-join-condition","p":1197},{"i":1203,"t":"Use the Join Condition","u":"/jimmer-doc/docs/query/dynamic-join/weak-join","h":"#use-the-join-condition","p":1197},{"i":1209,"t":"Mapping","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#mapping","p":1207},{"i":1211,"t":"Usage","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#usage","p":1207},{"i":1212,"t":"Filter root entity","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#filter-root-entity","p":1207},{"i":1214,"t":"Filter associated objects","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#filter-associated-objects","p":1207},{"i":1216,"t":"Ignore Logical Deletion Filter","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#ignore-logical-deletion-filter","p":1207},{"i":1218,"t":"Reverse Logical Deletion Filter","u":"/jimmer-doc/docs/query/global-filter/logical-deleted","h":"#reverse-logical-deletion-filter","p":1207},{"i":1222,"t":"Problems with Collection Associations","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#problems-with-collection-associations","p":1220},{"i":1224,"t":"Collection JOIN Causes Duplicate Results","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#collection-join-causes-duplicate-results","p":1220},{"i":1226,"t":"Harms of Duplicate Results","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#harms-of-duplicate-results","p":1220},{"i":1228,"t":"Implicit Subqueries","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#implicit-subqueries","p":1220},{"i":1230,"t":"Table and TableEx","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#table-and-tableex","p":1220},{"i":1232,"t":"Generated Code","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#generated-code","p":1220},{"i":1234,"t":"Top-Level Queries Must Be Based on Table","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#top-level-queries-must-be-based-on-table","p":1220},{"i":1236,"t":"TableEx Allowed for Subqueries","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#tableex-allowed-for-subqueries","p":1220},{"i":1238,"t":"asTableEx","u":"/jimmer-doc/docs/query/dynamic-join/table-ex","h":"#astableex","p":1220},{"i":1241,"t":"Aggregation","u":"/jimmer-doc/docs/query/group","h":"#aggregation","p":1240},{"i":1243,"t":"Grouping","u":"/jimmer-doc/docs/query/group","h":"#grouping","p":1240},{"i":1246,"t":"Provide Abstract Mapped Superclass","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#provide-abstract-mapped-superclass","p":1245},{"i":1248,"t":"Define Filter","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#define-filter","p":1245},{"i":1250,"t":"Configure Filter in Spring","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#configure-filter-in-spring","p":1245},{"i":1252,"t":"Configure Filter Without Spring","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#configure-filter-without-spring","p":1245},{"i":1254,"t":"Filter Aggregate Root Objects","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#filter-aggregate-root-objects","p":1245},{"i":1256,"t":"Filter Associated Objects","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#filter-associated-objects","p":1245},{"i":1258,"t":"Disable Filters","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#disable-filters","p":1245},{"i":1260,"t":"More filter interfaces","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#more-filter-interfaces","p":1245},{"i":1262,"t":"CacheableFilter","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#cacheablefilter","p":1245},{"i":1264,"t":"AssociationIntegrityAssuranceFilter","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#associationintegrityassurancefilter","p":1245},{"i":1266,"t":"Sharding Filters","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#sharding-filters","p":1245},{"i":1268,"t":"Multi-view Cache","u":"/jimmer-doc/docs/query/global-filter/user-filter","h":"#multi-view-cache","p":1245},{"i":1272,"t":"DSL Code generated by Jimmer","u":"/jimmer-doc/docs/query/implicit-subquery","h":"#dsl-code-generated-by-jimmer","p":1270},{"i":1274,"t":"Demo","u":"/jimmer-doc/docs/query/implicit-subquery","h":"#demo","p":1270},{"i":1276,"t":"Automatic Merge","u":"/jimmer-doc/docs/query/implicit-subquery","h":"#automatic-merge","p":1270},{"i":1280,"t":"Example 1: Regular Expression Matching","u":"/jimmer-doc/docs/query/native-sql","h":"#example-1-regular-expression-matching","p":1278},{"i":1282,"t":"Example 2: Analytic Functions","u":"/jimmer-doc/docs/query/native-sql","h":"#example-2-analytic-functions","p":1278},{"i":1285,"t":"Concept","u":"/jimmer-doc/docs/query/object-fetcher/","h":"#concept","p":1284},{"i":1287,"t":"Examples","u":"/jimmer-doc/docs/query/object-fetcher/","h":"#examples","p":1284},{"i":1291,"t":"Defining DTO Shapes","u":"/jimmer-doc/docs/query/object-fetcher/dto","h":"#defining-dto-shapes","p":1289},{"i":1293,"t":"Auto-generated DTO Types","u":"/jimmer-doc/docs/query/object-fetcher/dto","h":"#auto-generated-dto-types","p":1289},{"i":1295,"t":"Querying DTO Objects","u":"/jimmer-doc/docs/query/object-fetcher/dto","h":"#querying-dto-objects","p":1289},{"i":1296,"t":"Using findById","u":"/jimmer-doc/docs/query/object-fetcher/dto","h":"#using-findbyid","p":1289},{"i":1298,"t":"Using Custom Queries","u":"/jimmer-doc/docs/query/object-fetcher/dto","h":"#using-custom-queries","p":1289},{"i":1301,"t":"Usage","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#usage","p":1300},{"i":1302,"t":"Basic Concepts","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#basic-concepts","p":1300},{"i":1304,"t":"Another Solution","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#another-solution","p":1300},{"i":1306,"t":"Phantom Joins","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#phantom-joins","p":1300},{"i":1307,"t":"Two ways to filter on associated ids","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#two-ways-to-filter-on-associated-ids","p":1300},{"i":1309,"t":"Inapplicable Scenarios","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#inapplicable-scenarios","p":1300},{"i":1311,"t":"Applicable scenarios","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#applicable-scenarios","p":1300},{"i":1313,"t":"Half Joins","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#half-joins","p":1300},{"i":1315,"t":"Two ways to filter on associated ids","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#two-ways-to-filter-on-associated-ids-1","p":1300},{"i":1317,"t":"Inapplicable scenarios","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#inapplicable-scenarios-1","p":1300},{"i":1319,"t":"Applicable scenarios","u":"/jimmer-doc/docs/query/dynamic-join/optimization","h":"#applicable-scenarios-1","p":1300},{"i":1324,"t":"Fetching Scalar Fields","u":"/jimmer-doc/docs/query/object-fetcher/props","h":"#fetching-scalar-fields","p":1323},{"i":1326,"t":"Fetching Multiple Fields","u":"/jimmer-doc/docs/query/object-fetcher/props","h":"#fetching-multiple-fields","p":1323},{"i":1328,"t":"Fetching All Scalar Fields","u":"/jimmer-doc/docs/query/object-fetcher/props","h":"#fetching-all-scalar-fields","p":1323},{"i":1330,"t":"Negative Properties","u":"/jimmer-doc/docs/query/object-fetcher/props","h":"#negative-properties","p":1323},{"i":1333,"t":"Why Introduce Object Fetchers","u":"/jimmer-doc/docs/query/object-fetcher/usage","h":"#why-introduce-object-fetchers","p":1332},{"i":1335,"t":"Using Object Fetchers","u":"/jimmer-doc/docs/query/object-fetcher/usage","h":"#using-object-fetchers","p":1332},{"i":1337,"t":"Differences from JPA EntityGraph","u":"/jimmer-doc/docs/query/object-fetcher/usage","h":"#differences-from-jpa-entitygraph","p":1332},{"i":1343,"t":"Set Threshold","u":"/jimmer-doc/docs/query/paging/deep-optimization","h":"#set-threshold","p":1341},{"i":1345,"t":"Effectiveness","u":"/jimmer-doc/docs/query/paging/deep-optimization","h":"#effectiveness","p":1341},{"i":1347,"t":"Set to 0","u":"/jimmer-doc/docs/query/paging/deep-optimization","h":"#set-to-0","p":1341},{"i":1350,"t":"IdView","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#idview","p":1349},{"i":1352,"t":"Modify the Example Entity Interface","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#modify-the-example-entity-interface","p":1349},{"i":1354,"t":"Fetch @IdView Properties","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#fetch-idview-properties","p":1349},{"i":1356,"t":"ManyToManyView","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#manytomanyview","p":1349},{"i":1358,"t":"Prepare Data","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#prepare-data","p":1349},{"i":1360,"t":"Define Entities","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#define-entities","p":1349},{"i":1362,"t":"Fetch @ManyToManyView Properties","u":"/jimmer-doc/docs/query/object-fetcher/view","h":"#fetch-manytomanyview-properties","p":1349},{"i":1365,"t":"Literal Expressions","u":"/jimmer-doc/docs/query/expression","h":"#literal-expressions","p":1364},{"i":1367,"t":"Constant Expressions","u":"/jimmer-doc/docs/query/expression","h":"#constant-expressions","p":1364},{"i":1369,"t":"Static Predicates vs Dynamic Predicates","u":"/jimmer-doc/docs/query/expression","h":"#static-predicates-vs-dynamic-predicates","p":1364},{"i":1371,"t":"Comparison","u":"/jimmer-doc/docs/query/expression","h":"#comparison","p":1364},{"i":1373,"t":"Fuzzy Matching","u":"/jimmer-doc/docs/query/expression","h":"#fuzzy-matching","p":1364},{"i":1374,"t":"Case Sensitivity","u":"/jimmer-doc/docs/query/expression","h":"#case-sensitivity","p":1364},{"i":1376,"t":"Match Modes","u":"/jimmer-doc/docs/query/expression","h":"#match-modes","p":1364},{"i":1378,"t":"Null Check","u":"/jimmer-doc/docs/query/expression","h":"#null-check","p":1364},{"i":1380,"t":"IN LIST","u":"/jimmer-doc/docs/query/expression","h":"#in-list","p":1364},{"i":1381,"t":"Single Column","u":"/jimmer-doc/docs/query/expression","h":"#single-column","p":1364},{"i":1383,"t":"Multiple Columns","u":"/jimmer-doc/docs/query/expression","h":"#multiple-columns","p":1364},{"i":1385,"t":"Optimization","u":"/jimmer-doc/docs/query/expression","h":"#optimization","p":1364},{"i":1387,"t":"AND, OR, NOT","u":"/jimmer-doc/docs/query/expression","h":"#and-or-not","p":1364},{"i":1388,"t":"AND","u":"/jimmer-doc/docs/query/expression","h":"#and","p":1364},{"i":1390,"t":"OR","u":"/jimmer-doc/docs/query/expression","h":"#or","p":1364},{"i":1392,"t":"NOT","u":"/jimmer-doc/docs/query/expression","h":"#not","p":1364},{"i":1394,"t":"Math Operations","u":"/jimmer-doc/docs/query/expression","h":"#math-operations","p":1364},{"i":1396,"t":"Aggregate Functions","u":"/jimmer-doc/docs/query/expression","h":"#aggregate-functions","p":1364},{"i":1398,"t":"Coalesce","u":"/jimmer-doc/docs/query/expression","h":"#coalesce","p":1364},{"i":1400,"t":"Concat","u":"/jimmer-doc/docs/query/expression","h":"#concat","p":1364},{"i":1402,"t":"Case","u":"/jimmer-doc/docs/query/expression","h":"#case","p":1364},{"i":1404,"t":"Simple Case","u":"/jimmer-doc/docs/query/expression","h":"#simple-case","p":1364},{"i":1406,"t":"Searched Case","u":"/jimmer-doc/docs/query/expression","h":"#searched-case","p":1364},{"i":1410,"t":"Fetch associated objects with only id","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#fetch-associated-objects-with-only-id","p":1408},{"i":1412,"t":"ManyToOne: Book.store","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#manytoone-bookstore","p":1408},{"i":1414,"t":"ManyToMany: Book.authors","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#manytomany-bookauthors","p":1408},{"i":1416,"t":"Fetch complex associated objects","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#fetch-complex-associated-objects","p":1408},{"i":1418,"t":"ManyToOne: Book.store","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#manytoone-bookstore-1","p":1408},{"i":1420,"t":"ManyToMany: Book.authors","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#manytomany-bookauthors-1","p":1408},{"i":1422,"t":"Fetching all table fields","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#fetching-all-table-fields","p":1408},{"i":1424,"t":"Special Configurations for Associations","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#special-configurations-for-associations","p":1408},{"i":1425,"t":"BatchSize","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#batchsize","p":1408},{"i":1427,"t":"Pagination at Association Level","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#pagination-at-association-level","p":1408},{"i":1429,"t":"Property-level Filters","u":"/jimmer-doc/docs/query/object-fetcher/association","h":"#property-level-filters","p":1408},{"i":1433,"t":"Optimization Rules","u":"/jimmer-doc/docs/query/paging/unnecessary-join","h":"#optimization-rules","p":1431},{"i":1435,"t":"Non-Optimizable Scenario","u":"/jimmer-doc/docs/query/paging/unnecessary-join","h":"#non-optimizable-scenario","p":1431},{"i":1437,"t":"Optimizable Scenario","u":"/jimmer-doc/docs/query/paging/unnecessary-join","h":"#optimizable-scenario","p":1431},{"i":1440,"t":"Concept","u":"/jimmer-doc/docs/query/paging/reverse-sorting","h":"#concept","p":1439},{"i":1442,"t":"Example","u":"/jimmer-doc/docs/query/paging/reverse-sorting","h":"#example","p":1439},{"i":1444,"t":"Forward Sorting","u":"/jimmer-doc/docs/query/paging/reverse-sorting","h":"#forward-sorting","p":1439},{"i":1446,"t":"Reverse Sorting","u":"/jimmer-doc/docs/query/paging/reverse-sorting","h":"#reverse-sorting","p":1439},{"i":1449,"t":"Typed Subqueries","u":"/jimmer-doc/docs/query/sub-query","h":"#typed-subqueries","p":1448},{"i":1450,"t":"IN expression based on single column","u":"/jimmer-doc/docs/query/sub-query","h":"#in-expression-based-on-single-column","p":1448},{"i":1452,"t":"IN expression based on multiple columns","u":"/jimmer-doc/docs/query/sub-query","h":"#in-expression-based-on-multiple-columns","p":1448},{"i":1454,"t":"Treat subquery as simple value","u":"/jimmer-doc/docs/query/sub-query","h":"#treat-subquery-as-simple-value","p":1448},{"i":1456,"t":"Use subquery in select and orderBy clauses","u":"/jimmer-doc/docs/query/sub-query","h":"#use-subquery-in-select-and-orderby-clauses","p":1448},{"i":1458,"t":"Use ANY operator","u":"/jimmer-doc/docs/query/sub-query","h":"#use-any-operator","p":1448},{"i":1460,"t":"Use ALL operator","u":"/jimmer-doc/docs/query/sub-query","h":"#use-all-operator","p":1448},{"i":1462,"t":"Use EXISTS operator","u":"/jimmer-doc/docs/query/sub-query","h":"#use-exists-operator","p":1448},{"i":1464,"t":"Untyped Subqueries","u":"/jimmer-doc/docs/query/sub-query","h":"#untyped-subqueries","p":1448},{"i":1467,"t":"Select-After Style","u":"/jimmer-doc/docs/query/usage","h":"#select-after-style","p":1466},{"i":1469,"t":"Code Structure","u":"/jimmer-doc/docs/query/usage","h":"#code-structure","p":1466},{"i":1473,"t":"Create File","u":"/jimmer-doc/docs/query/super_qbe","h":"#create-file","p":1471},{"i":1475,"t":"Define Specification Type","u":"/jimmer-doc/docs/query/super_qbe","h":"#define-specification-type","p":1471},{"i":1477,"t":"Compiled Code","u":"/jimmer-doc/docs/query/super_qbe","h":"#compiled-code","p":1471},{"i":1479,"t":"Usage","u":"/jimmer-doc/docs/query/super_qbe","h":"#usage","p":1471},{"i":1481,"t":"Attribute Mapping","u":"/jimmer-doc/docs/query/super_qbe","h":"#attribute-mapping","p":1471},{"i":1482,"t":"Map Attributes","u":"/jimmer-doc/docs/query/super_qbe","h":"#map-attributes","p":1471},{"i":1484,"t":"Nullability","u":"/jimmer-doc/docs/query/super_qbe","h":"#nullability","p":1471},{"i":1486,"t":"Usage","u":"/jimmer-doc/docs/query/super_qbe","h":"#usage-1","p":1471},{"i":1488,"t":"QBE Functions","u":"/jimmer-doc/docs/query/super_qbe","h":"#qbe-functions","p":1471},{"i":1489,"t":"Introduction to QBE Functions","u":"/jimmer-doc/docs/query/super_qbe","h":"#introduction-to-qbe-functions","p":1471},{"i":1491,"t":"like Function Options","u":"/jimmer-doc/docs/query/super_qbe","h":"#like-function-options","p":1471},{"i":1493,"t":"All QBE Functions","u":"/jimmer-doc/docs/query/super_qbe","h":"#all-qbe-functions","p":1471},{"i":1495,"t":"Comprehensive Example","u":"/jimmer-doc/docs/query/super_qbe","h":"#comprehensive-example","p":1471},{"i":1497,"t":"Associated Objects","u":"/jimmer-doc/docs/query/super_qbe","h":"#associated-objects","p":1471},{"i":1499,"t":"Logical OR","u":"/jimmer-doc/docs/query/super_qbe","h":"#logical-or","p":1471},{"i":1506,"t":"Basic Concepts","u":"/jimmer-doc/docs/quick-view/fetch/","h":"#basic-concepts","p":1505},{"i":1508,"t":"Demo","u":"/jimmer-doc/docs/quick-view/fetch/","h":"#demo","p":1505},{"i":1511,"t":"Features of Jimmer Pagination","u":"/jimmer-doc/docs/query/paging/usage","h":"#features-of-jimmer-pagination","p":1510},{"i":1513,"t":"When Used with Spring Data","u":"/jimmer-doc/docs/query/paging/usage","h":"#when-used-with-spring-data","p":1510},{"i":1515,"t":"When Not Using Spring Data","u":"/jimmer-doc/docs/query/paging/usage","h":"#when-not-using-spring-data","p":1510},{"i":1516,"t":"Jimmer's Page object","u":"/jimmer-doc/docs/query/paging/usage","h":"#jimmers-page-object","p":1510},{"i":1518,"t":"Implement Business Logic","u":"/jimmer-doc/docs/query/paging/usage","h":"#implement-business-logic","p":1510},{"i":1520,"t":"Internal Mechanism","u":"/jimmer-doc/docs/query/paging/usage","h":"#internal-mechanism","p":1510},{"i":1522,"t":"Dialects","u":"/jimmer-doc/docs/query/paging/usage","h":"#dialects","p":1510},{"i":1524,"t":"Default Behavior","u":"/jimmer-doc/docs/query/paging/usage","h":"#default-behavior","p":1510},{"i":1526,"t":"MySqlDialect","u":"/jimmer-doc/docs/query/paging/usage","h":"#mysqldialect","p":1510},{"i":1528,"t":"OracleDialect","u":"/jimmer-doc/docs/query/paging/usage","h":"#oracledialect","p":1510},{"i":1530,"t":"Used with Object Fetcher","u":"/jimmer-doc/docs/query/paging/usage","h":"#used-with-object-fetcher","p":1510},{"i":1535,"t":"Can It Be Simpler","u":"/jimmer-doc/docs/quick-view/dsl/super_qbe","h":"#can-it-be-simpler","p":1534},{"i":1537,"t":"Define Specification DTO","u":"/jimmer-doc/docs/quick-view/dsl/super_qbe","h":"#define-specification-dto","p":1534},{"i":1539,"t":"Generated Code","u":"/jimmer-doc/docs/quick-view/dsl/super_qbe","h":"#generated-code","p":1534},{"i":1541,"t":"Usage","u":"/jimmer-doc/docs/quick-view/dsl/super_qbe","h":"#usage","p":1534},{"i":1545,"t":"Model and Data Preparation","u":"/jimmer-doc/docs/query/object-fetcher/recursive","h":"#model-and-data-preparation","p":1543},{"i":1547,"t":"Unlimited Recursion","u":"/jimmer-doc/docs/query/object-fetcher/recursive","h":"#unlimited-recursion","p":1543},{"i":1549,"t":"Limited Depth","u":"/jimmer-doc/docs/query/object-fetcher/recursive","h":"#limited-depth","p":1543},{"i":1551,"t":"Control Recursion Per Node","u":"/jimmer-doc/docs/query/object-fetcher/recursive","h":"#control-recursion-per-node","p":1543},{"i":1553,"t":"Recursion on Multiple Properties","u":"/jimmer-doc/docs/query/object-fetcher/recursive","h":"#recursion-on-multiple-properties","p":1543},{"i":1560,"t":"Enable Web API Analysis","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#enable-web-api-analysis","p":1559},{"i":1562,"t":"Write RestController","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#write-restcontroller","p":1559},{"i":1564,"t":"View API Documentation","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#view-api-documentation","p":1559},{"i":1566,"t":"Generate TypeScript","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#generate-typescript","p":1559},{"i":1568,"t":"Document Comments","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#document-comments","p":1559},{"i":1570,"t":"Flat Associated IDs","u":"/jimmer-doc/docs/quick-view/fetch/export/entity","h":"#flat-associated-ids","p":1559},{"i":1573,"t":"Jimmer SQL DSL","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#jimmer-sql-dsl","p":1572},{"i":1575,"t":"Dynamic Predicates","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#dynamic-predicates","p":1572},{"i":1577,"t":"Dynamic Table Joins","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#dynamic-table-joins","p":1572},{"i":1578,"t":"Define dynamic table joins","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#define-dynamic-table-joins","p":1572},{"i":1580,"t":"Ignore useless table joins","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#ignore-useless-table-joins","p":1572},{"i":1582,"t":"Merge Conflicting Table Joins","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#merge-conflicting-table-joins","p":1572},{"i":1584,"t":"Implicit Subqueries","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#implicit-subqueries","p":1572},{"i":1585,"t":"Define implicit subqueries","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#define-implicit-subqueries","p":1572},{"i":1587,"t":"Ignore useless subqueries","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#ignore-useless-subqueries","p":1572},{"i":1589,"t":"Merge conflicting subqueries","u":"/jimmer-doc/docs/quick-view/dsl/feature","h":"#merge-conflicting-subqueries","p":1572},{"i":1592,"t":"UML","u":"/jimmer-doc/docs/quick-view/get-started/create-database","h":"#uml","p":1591},{"i":1594,"t":"Create SQL File","u":"/jimmer-doc/docs/quick-view/get-started/create-database","h":"#create-sql-file","p":1591},{"i":1598,"t":"Create a Spring Boot Project","u":"/jimmer-doc/docs/quick-view/get-started/create-project","h":"#create-a-spring-boot-project","p":1597},{"i":1600,"t":"Add Dependencies","u":"/jimmer-doc/docs/quick-view/get-started/create-project","h":"#add-dependencies","p":1597},{"i":1602,"t":"Additional Configuration Needed for Kotlin","u":"/jimmer-doc/docs/quick-view/get-started/create-project","h":"#additional-configuration-needed-for-kotlin","p":1597},{"i":1604,"t":"Other Useful Configurations","u":"/jimmer-doc/docs/quick-view/get-started/create-project","h":"#other-useful-configurations","p":1597},{"i":1606,"t":"Add Other Required Dependencies","u":"/jimmer-doc/docs/quick-view/get-started/create-project","h":"#add-other-required-dependencies","p":1597},{"i":1609,"t":"Code Generation","u":"/jimmer-doc/docs/quick-view/get-started/generate-code","h":"#code-generation","p":1608},{"i":1611,"t":"Verify Successful Generation","u":"/jimmer-doc/docs/quick-view/get-started/generate-code","h":"#verify-successful-generation","p":1608},{"i":1615,"t":"SqlClient","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#sqlclient","p":1613},{"i":1617,"t":"Query","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#query","p":1613},{"i":1619,"t":"Save","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#save","p":1613},{"i":1620,"t":"Save Short Associations","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#save-short-associations","p":1613},{"i":1622,"t":"Save Long Associations","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#save-long-associations","p":1613},{"i":1624,"t":"Delete","u":"/jimmer-doc/docs/quick-view/get-started/usage","h":"#delete","p":1613},{"i":1627,"t":"Java/Kotlin Applications Use Query Results","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#javakotlin-applications-use-query-results","p":1626},{"i":1629,"t":"DTO Language","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#dto-language","p":1626},{"i":1631,"t":"DTO Language Plugin","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#dto-language-plugin","p":1626},{"i":1633,"t":"Define DTO Files","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#define-dto-files","p":1626},{"i":1635,"t":"View Generated DTOs","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#view-generated-dtos","p":1626},{"i":1637,"t":"New BookRepository","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#new-bookrepository","p":1626},{"i":1638,"t":"Review Old BookRepository","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#review-old-bookrepository","p":1626},{"i":1640,"t":"Write New BookRepository","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#write-new-bookrepository","p":1626},{"i":1642,"t":"Try New BookRepository","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#try-new-bookrepository","p":1626},{"i":1644,"t":"Write BookController","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#write-bookcontroller","p":1626},{"i":1646,"t":"Document Comments","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#document-comments","p":1626},{"i":1648,"t":"Flat Association ID","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#flat-association-id","p":1626},{"i":1650,"t":"Flat Associated Objects","u":"/jimmer-doc/docs/quick-view/fetch/export/dto","h":"#flat-associated-objects","p":1626},{"i":1654,"t":"Basic Usage","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#basic-usage","p":1652},{"i":1656,"t":"1. Query Partial Objects","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#1-query-partial-objects","p":1652},{"i":1658,"t":"2. Include Associated Objects","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#2-include-associated-objects","p":1652},{"i":1660,"t":"3. Recursive Query","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#3-recursive-query","p":1652},{"i":1662,"t":"Repository Code Style","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#repository-code-style","p":1652},{"i":1664,"t":"The Simplest Repository","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#the-simplest-repository","p":1652},{"i":1666,"t":"Improved Repository","u":"/jimmer-doc/docs/quick-view/fetch/feature","h":"#improved-repository","p":1652},{"i":1672,"t":"Status of Entities","u":"/jimmer-doc/docs/quick-view/precondition","h":"#status-of-entities","p":1670},{"i":1674,"t":"UML Relationships Between Entities","u":"/jimmer-doc/docs/quick-view/precondition","h":"#uml-relationships-between-entities","p":1670},{"i":1676,"t":"Entity Type Definitions","u":"/jimmer-doc/docs/quick-view/precondition","h":"#entity-type-definitions","p":1670},{"i":1677,"t":"BookStore","u":"/jimmer-doc/docs/quick-view/precondition","h":"#bookstore","p":1670},{"i":1679,"t":"Book","u":"/jimmer-doc/docs/quick-view/precondition","h":"#book","p":1670},{"i":1681,"t":"Author","u":"/jimmer-doc/docs/quick-view/precondition","h":"#author","p":1670},{"i":1686,"t":"What is Long Association","u":"/jimmer-doc/docs/quick-view/save/export/long","h":"#what-is-long-association","p":1685},{"i":1688,"t":"Write DTO","u":"/jimmer-doc/docs/quick-view/save/export/long","h":"#write-dto","p":1685},{"i":1690,"t":"Generated Code","u":"/jimmer-doc/docs/quick-view/save/export/long","h":"#generated-code","p":1685},{"i":1692,"t":"Write HTTP Service","u":"/jimmer-doc/docs/quick-view/save/export/long","h":"#write-http-service","p":1685},{"i":1695,"t":"Concept","u":"/jimmer-doc/docs/quick-view/save/feature","h":"#concept","p":1694},{"i":1697,"t":"Scenarios","u":"/jimmer-doc/docs/quick-view/save/feature","h":"#scenarios","p":1694},{"i":1699,"t":"Demo","u":"/jimmer-doc/docs/quick-view/save/feature","h":"#demo","p":1694},{"i":1701,"t":"Essential Difference from Other ORM","u":"/jimmer-doc/docs/quick-view/save/feature","h":"#essential-difference-from-other-orm","p":1694},{"i":1703,"t":"Note: Cannot Expose Directly","u":"/jimmer-doc/docs/quick-view/save/feature","h":"#note-cannot-expose-directly","p":1694},{"i":1706,"t":"What is Short Association","u":"/jimmer-doc/docs/quick-view/save/export/short","h":"#what-is-short-association","p":1705},{"i":1708,"t":"Book Form","u":"/jimmer-doc/docs/quick-view/save/export/short","h":"","p":1705},{"i":1710,"t":"Define Input DTO","u":"/jimmer-doc/docs/quick-view/save/export/short","h":"#define-input-dto","p":1705},{"i":1712,"t":"Generated Code","u":"/jimmer-doc/docs/quick-view/save/export/short","h":"#generated-code","p":1705},{"i":1714,"t":"Write HTTP Service","u":"/jimmer-doc/docs/quick-view/save/export/short","h":"#write-http-service","p":1705},{"i":1718,"t":"Define Non-Associated Fields","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#define-non-associated-fields","p":1716},{"i":1720,"t":"One-to-Many Association Book.store","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#one-to-many-association-bookstore","p":1716},{"i":1722,"t":"One-to-Many Association BookStore.books","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#one-to-many-association-bookstorebooks","p":1716},{"i":1724,"t":"Many-to-Many Association Book.authors","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#many-to-many-association-bookauthors","p":1716},{"i":1726,"t":"Many-to-Many Association Author.books","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#many-to-many-association-authorbooks","p":1716},{"i":1728,"t":"Complete TreeNode Definition","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#complete-treenode-definition","p":1716},{"i":1730,"t":"Why Interfaces","u":"/jimmer-doc/docs/quick-view/get-started/define-entity","h":"#why-interfaces","p":1716},{"i":1736,"t":"Overview","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#overview","p":1735},{"i":1738,"t":"Homogeneous Change Scenario","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#homogeneous-change-scenario","p":1735},{"i":1739,"t":"Define Input DTO","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#define-input-dto","p":1735},{"i":1741,"t":"Generated Code","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#generated-code","p":1735},{"i":1743,"t":"Write HTTP Service","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#write-http-service","p":1735},{"i":1745,"t":"Heterogeneous Change Scenario","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#heterogeneous-change-scenario","p":1735},{"i":1746,"t":"Requirements","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#requirements","p":1735},{"i":1748,"t":"Write DTO","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#write-dto","p":1735},{"i":1750,"t":"Generated Code","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#generated-code-1","p":1735},{"i":1752,"t":"Write HTTP Service","u":"/jimmer-doc/docs/quick-view/save/export/root","h":"#write-http-service-1","p":1735},{"i":1755,"t":"TODO","u":"/jimmer-doc/docs/resource/video","h":"#todo","p":1754},{"i":1758,"t":"DTO Language Syntax Highlighting Plugin","u":"/jimmer-doc/docs/resource/ecosystem","h":"#dto-language-syntax-highlighting-plugin","p":1756},{"i":1760,"t":"Simplify Project Configurations","u":"/jimmer-doc/docs/resource/ecosystem","h":"#simplify-project-configurations","p":1756},{"i":1762,"t":"Generate Entity Definitions by Database","u":"/jimmer-doc/docs/resource/ecosystem","h":"#generate-entity-definitions-by-database","p":1756},{"i":1764,"t":"Quarkus Extension","u":"/jimmer-doc/docs/resource/ecosystem","h":"#quarkus-extension","p":1756},{"i":1766,"t":"Solon Extension","u":"/jimmer-doc/docs/resource/ecosystem","h":"#solon-extension","p":1756},{"i":1770,"t":"Prerequisites","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#prerequisites","p":1768},{"i":1772,"t":"Example Introduction","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#example-introduction","p":1768},{"i":1774,"t":"Non-Cache Mode","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#non-cache-mode","p":1768},{"i":1776,"t":"Cache Mode","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#cache-mode","p":1768},{"i":1778,"t":"Maxwell + MySQL","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#maxwell--mysql","p":1768},{"i":1780,"t":"Debezium + Postgres","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#debezium--postgres","p":1768},{"i":1782,"t":"Notes","u":"/jimmer-doc/docs/quick-view/standard-demo","h":"#notes","p":1768},{"i":1786,"t":"Query multiple columns","u":"/jimmer-doc/docs/showcase/base","h":"#query-multiple-columns","p":1784},{"i":1788,"t":"Specify properties of the queried object","u":"/jimmer-doc/docs/showcase/base","h":"#specify-properties-of-the-queried-object","p":1784},{"i":1790,"t":"Combine both","u":"/jimmer-doc/docs/showcase/base","h":"#combine-both","p":1784},{"i":1796,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/fetch-association/deeper-association","h":"#query-dynamic-entities","p":1795},{"i":1798,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/fetch-association/deeper-association","h":"#query-static-dto","p":1795},{"i":1801,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/fetch-association/associated-object","h":"#query-dynamic-entities","p":1800},{"i":1803,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/fetch-association/associated-object","h":"#query-static-dto","p":1800},{"i":1807,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/fetch-association/associated-id","h":"#query-dynamic-entities","p":1805},{"i":1808,"t":"If there is no IdView property","u":"/jimmer-doc/docs/showcase/fetch-association/associated-id","h":"#if-there-is-no-idview-property","p":1805},{"i":1810,"t":"If there is IdView property","u":"/jimmer-doc/docs/showcase/fetch-association/associated-id","h":"#if-there-is-idview-property","p":1805},{"i":1812,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/fetch-association/associated-id","h":"#query-static-dto","p":1805},{"i":1816,"t":"Use Strings Directly","u":"/jimmer-doc/docs/showcase/order-by/dynamic","h":"#use-strings-directly","p":1814},{"i":1818,"t":"Transfer via Spring Sort","u":"/jimmer-doc/docs/showcase/order-by/dynamic","h":"#transfer-via-spring-sort","p":1814},{"i":1820,"t":"I. Convert string to Sort Object","u":"/jimmer-doc/docs/showcase/order-by/dynamic","h":"#i-convert-string-to-sort-object","p":1814},{"i":1822,"t":"II. Sort using Sort object","u":"/jimmer-doc/docs/showcase/order-by/dynamic","h":"#ii-sort-using-sort-object","p":1814},{"i":1827,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/comprehensive-query","h":"#query-dynamic-entities","p":1825},{"i":1829,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/comprehensive-query","h":"#query-static-dto","p":1825},{"i":1833,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/fetch-association/more-association","h":"#query-dynamic-entities","p":1832},{"i":1835,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/fetch-association/more-association","h":"#query-static-dto","p":1832},{"i":1838,"t":"Multiple orderBy actions","u":"/jimmer-doc/docs/showcase/order-by/usage","h":"#multiple-orderby-actions","p":1837},{"i":1840,"t":"orderBy with multiple arguments","u":"/jimmer-doc/docs/showcase/order-by/usage","h":"#orderby-with-multiple-arguments","p":1837},{"i":1842,"t":"Sorting based on subqueries","u":"/jimmer-doc/docs/showcase/order-by/usage","h":"#sorting-based-on-subqueries","p":1837},{"i":1845,"t":"Two types of Page objects","u":"/jimmer-doc/docs/showcase/page","h":"#two-types-of-page-objects","p":1844},{"i":1847,"t":"Using the page of Jimmer","u":"/jimmer-doc/docs/showcase/page","h":"#using-the-page-of-jimmer","p":1844},{"i":1849,"t":"Using the page of Spring Data","u":"/jimmer-doc/docs/showcase/page","h":"#using-the-page-of-spring-data","p":1844},{"i":1852,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/recursive-query/multiple-props","h":"#query-dynamic-entities","p":1851},{"i":1854,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/recursive-query/multiple-props","h":"#query-static-dto","p":1851},{"i":1857,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/recursive-query/depth","h":"#query-dynamic-entities","p":1856},{"i":1859,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/recursive-query/depth","h":"#query-static-dto","p":1856},{"i":1862,"t":"标准子查询","u":"/jimmer-doc/docs/showcase/other-query","h":"#标准子查询","p":1861},{"i":1864,"t":"Native SQL","u":"/jimmer-doc/docs/showcase/other-query","h":"#native-sql","p":1861},{"i":1870,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/recursive-query/node-control","h":"#query-dynamic-entities","p":1869},{"i":1872,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/recursive-query/node-control","h":"#query-static-dto","p":1869},{"i":1875,"t":"IsNull判断","u":"/jimmer-doc/docs/showcase/where/associated-id","h":"#isnull判断","p":1874},{"i":1877,"t":"Judgment of any value","u":"/jimmer-doc/docs/showcase/where/associated-id","h":"#judgment-of-any-value","p":1874},{"i":1880,"t":"Usage","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#usage","p":1879},{"i":1882,"t":"Various Situations","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#various-situations","p":1879},{"i":1883,"t":"All table joins do not take effect","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#all-table-joins-do-not-take-effect","p":1879},{"i":1885,"t":"Some table joins take effect","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#some-table-joins-take-effect","p":1879},{"i":1887,"t":"All table joins take effect","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#all-table-joins-take-effect","p":1879},{"i":1889,"t":"IsNull和外连接","u":"/jimmer-doc/docs/showcase/where/dynamic-join","h":"#isnull和外连接","p":1879},{"i":1894,"t":"Usage","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","h":"#usage","p":1892},{"i":1896,"t":"Various Situations","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","h":"#various-situations","p":1892},{"i":1897,"t":"All subqueries are invalid","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","h":"#all-subqueries-are-invalid","p":1892},{"i":1899,"t":"Some subqueries take effect","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","h":"#some-subqueries-take-effect","p":1892},{"i":1901,"t":"All subqueries take effect","u":"/jimmer-doc/docs/showcase/where/implicit-subquery","h":"#all-subqueries-take-effect","p":1892},{"i":1912,"t":"Query Dynamic Entities","u":"/jimmer-doc/docs/showcase/recursive-query/usage","h":"#query-dynamic-entities","p":1911},{"i":1914,"t":"Query Static DTO","u":"/jimmer-doc/docs/showcase/recursive-query/usage","h":"#query-static-dto","p":1911},{"i":1918,"t":"Use multiple filters","u":"/jimmer-doc/docs/showcase/where/usage","h":"#use-multiple-filters","p":1916},{"i":1920,"t":"Filter with multiple arguments","u":"/jimmer-doc/docs/showcase/where/usage","h":"#filter-with-multiple-arguments","p":1916},{"i":1922,"t":"Logic And","u":"/jimmer-doc/docs/showcase/where/usage","h":"#logic-and","p":1916},{"i":1924,"t":"Suggestion","u":"/jimmer-doc/docs/showcase/where/usage","h":"#suggestion","p":1916},{"i":1928,"t":"Databases","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#databases","p":1926},{"i":1930,"t":"Entity Definition","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#entity-definition","p":1926},{"i":1932,"t":"Registry Center","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#registry-center","p":1926},{"i":1934,"t":"Implementing Services","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#implementing-services","p":1926},{"i":1936,"t":"Enable Microservice Support in Jimmer","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#enable-microservice-support-in-jimmer","p":1926},{"i":1938,"t":"Implement Business Query Logic","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#implement-business-query-logic","p":1926},{"i":1940,"t":"Run Effects","u":"/jimmer-doc/docs/spring/spring-cloud","h":"#run-effects","p":1926},{"i":1943,"t":"Using whereIf","u":"/jimmer-doc/docs/showcase/where/dynamic-where","h":"#using-whereif","p":1942},{"i":1945,"t":"Using Dynamic Predicate","u":"/jimmer-doc/docs/showcase/where/dynamic-where","h":"#using-dynamic-predicate","p":1942},{"i":1947,"t":"Comparison","u":"/jimmer-doc/docs/showcase/where/dynamic-where","h":"#comparison","p":1942},{"i":1950,"t":"Integrate Spring Transaction","u":"/jimmer-doc/docs/spring/transaction","h":"#integrate-spring-transaction","p":1949},{"i":1952,"t":"Using Spring Boot starter","u":"/jimmer-doc/docs/spring/transaction","h":"#using-spring-boot-starter","p":1949},{"i":1954,"t":"Not Using Spring Boot Starter","u":"/jimmer-doc/docs/spring/transaction","h":"#not-using-spring-boot-starter","p":1949},{"i":1956,"t":"Work with JdbcTemplate","u":"/jimmer-doc/docs/spring/transaction","h":"#work-with-jdbctemplate","p":1949},{"i":1958,"t":"Multiple Data Sources","u":"/jimmer-doc/docs/spring/transaction","h":"#multiple-data-sources","p":1949},{"i":1962,"t":"Define DTO shape","u":"/jimmer-doc/docs/spring/repository/dto","h":"#define-dto-shape","p":1960},{"i":1964,"t":"Automatically generate DTO types","u":"/jimmer-doc/docs/spring/repository/dto","h":"#automatically-generate-dto-types","p":1960},{"i":1966,"t":"Query DTO types","u":"/jimmer-doc/docs/spring/repository/dto","h":"#query-dto-types","p":1960},{"i":1968,"t":"Use inherited methods from Repository","u":"/jimmer-doc/docs/spring/repository/dto","h":"#use-inherited-methods-from-repository","p":1960},{"i":1970,"t":"Define abstract methods in custom Repository","u":"/jimmer-doc/docs/spring/repository/dto","h":"#define-abstract-methods-in-custom-repository","p":1960},{"i":1972,"t":"Define default methods in custom Repository","u":"/jimmer-doc/docs/spring/repository/dto","h":"#define-default-methods-in-custom-repository","p":1960},{"i":1976,"t":"Dynamic WHERE","u":"/jimmer-doc/docs/spring/repository/abstract","h":"#dynamic-where","p":1974},{"i":1978,"t":"Dynamic JOIN","u":"/jimmer-doc/docs/spring/repository/abstract","h":"#dynamic-join","p":1974},{"i":1980,"t":"Dynamic ORDER BY","u":"/jimmer-doc/docs/spring/repository/abstract","h":"#dynamic-order-by","p":1974},{"i":1982,"t":"Paged Queries","u":"/jimmer-doc/docs/spring/repository/abstract","h":"#paged-queries","p":1974},{"i":1984,"t":"Object Fetchers","u":"/jimmer-doc/docs/spring/repository/abstract","h":"#object-fetchers","p":1974},{"i":1988,"t":"Dynamic WHERE","u":"/jimmer-doc/docs/spring/repository/default","h":"#dynamic-where","p":1986},{"i":1990,"t":"Dynamic JOIN","u":"/jimmer-doc/docs/spring/repository/default","h":"#dynamic-join","p":1986},{"i":1992,"t":"Subqueries","u":"/jimmer-doc/docs/spring/repository/default","h":"#subqueries","p":1986},{"i":1994,"t":"Dynamic ORDER BY","u":"/jimmer-doc/docs/spring/repository/default","h":"#dynamic-order-by","p":1986},{"i":1996,"t":"Pagination","u":"/jimmer-doc/docs/spring/repository/default","h":"#pagination","p":1986},{"i":1998,"t":"Object Fetcher","u":"/jimmer-doc/docs/spring/repository/default","h":"#object-fetcher","p":1986}],"index":{"version":"2.3.9","fields":["t"],"fieldVectors":[["t/16",[0,4.092,1,2.921,2,3.694]],["t/18",[1,2.921,2,3.694,3,2.83]],["t/20",[4,3.077,5,3.872,6,3.749]],["t/22",[1,2.921,3,2.83,7,4.273]],["t/24",[2,4.327,8,5.614]],["t/28",[9,4.832,10,4.832,11,3.727,12,4.554]],["t/30",[9,5.54,11,4.273,13,4.792]],["t/34",[14,4.379,15,3.049,16,6.025]],["t/36",[0,4.092,2,3.694,14,4.379]],["t/38",[17,4.522]],["t/40",[2,4.327,8,5.614]],["t/41",[11,5.006,18,7.058]],["t/43",[6,2.9,19,2.816,20,4.66,21,3.854,22,3.706]],["t/45",[19,3.641,22,4.792,23,6.025]],["t/50",[24,8.52]],["t/52",[25,6.116,26,7.058]],["t/54",[27,3.584,28,3.854,29,2.672,30,3.305,31,3.232]],["t/59",[0,4.092,2,3.694,32,2.565]],["t/61",[32,2.565,33,4.379,34,4.982]],["t/63",[17,4.522]],["t/65",[19,3.176,35,3.923,36,3.569,37,4.042]],["t/67",[19,3.176,36,5.187,38,3.923]],["t/69",[2,4.327,8,5.614]],["t/71",[19,3.176,35,3.923,36,3.569,37,4.042]],["t/73",[19,3.176,36,5.187,38,3.923]],["t/75",[39,4.092,40,4.178,41,4.273]],["t/78",[42,4.522]],["t/80",[43,5.571]],["t/82",[44,7.046]],["t/84",[15,3.049,32,2.565,44,4.982]],["t/86",[14,3.82,15,2.66,44,4.346,45,4.832]],["t/90",[2,3.694,46,5.54,47,3.543]],["t/91",[42,3.747,48,3.953]],["t/93",[2,3.222,46,4.832,47,3.091,49,2.636]],["t/95",[0,3.569,2,3.222,50,3.923,51,3.82]],["t/96",[52,5.428,53,6.49]],["t/98",[53,6.49,54,7.058]],["t/100",[14,4.379,15,3.049,44,4.982]],["t/102",[17,4.522]],["t/104",[35,3.923,55,4.832,56,4.832,57,4.832]],["t/106",[55,4.285,56,4.285,57,4.285,58,4.66,59,2.946]],["t/108",[2,4.327,8,5.614]],["t/111",[60,6.49,61,5.269]],["t/113",[2,3.222,50,3.923,62,3.727,63,5.255]],["t/115",[60,6.49,64,4.393]],["t/117",[64,4.393,65,6.116]],["t/119",[64,3.749,66,6.025,67,4.178]],["t/121",[2,3.222,67,3.645,68,5.255,69,5.255]],["t/127",[3,2.468,29,3.014,30,3.727,31,3.645]],["t/129",[3,1.966,29,2.401,30,2.969,31,2.903,70,4.186,71,4.186]],["t/132",[42,3.747,48,3.953]],["t/134",[72,4.498,73,3.022,74,4.982]],["t/136",[12,5.221,72,4.498,75,3.022]],["t/138",[72,3.923,76,2.818,77,5.255,78,5.255]],["t/140",[17,4.522]],["t/141",[79,6.116,80,7.058]],["t/143",[81,3.591,82,4.792,83,3.809]],["t/145",[82,4.18,84,4.554,85,4.832,86,4.554]],["t/147",[87,5.221,88,4.379,89,3.414]],["t/152",[90,4.462,91,5.269]],["t/154",[0,4.794,92,6.49]],["t/156",[93,4.792,94,3.336,95,5.221]],["t/158",[92,4.832,96,5.255,97,4.346,98,4.832]],["t/166",[99,5.428,100,6.116]],["t/168",[100,6.116,101,6.49]],["t/171",[42,4.522]],["t/173",[52,5.428,102,6.49]],["t/175",[13,4.18,29,3.014,102,4.832,103,5.255]],["t/183",[0,4.092,104,6.025,105,4.792]],["t/185",[0,4.092,105,4.792,106,6.025]],["t/193",[107,5.13,108,5.837]],["t/195",[49,3.022,107,4.379,108,4.982]],["t/197",[83,3.322,109,3.727,110,3.645,111,5.255]],["t/199",[67,3.645,79,4.554,107,3.82,112,5.255]],["t/200",[107,3.82,108,4.346,113,4.554,114,4.554]],["t/202",[107,3.82,108,4.346,113,4.554,114,4.554]],["t/204",[107,3.82,115,4.832,116,5.255,117,4.18]],["t/205",[107,5.13,114,6.116]],["t/207",[107,3.387,118,3.232,119,4.285,120,3.479,121,4.66]],["t/209",[82,6.776]],["t/210",[81,3.591,83,3.809,122,4.982]],["t/212",[6,3.749,122,4.982,123,4.178]],["t/216",[13,4.792,124,6.025,125,4.273]],["t/218",[13,4.792,125,4.273,126,6.025]],["t/224",[0,4.092,127,4.379,128,6.025]],["t/226",[127,5.13,129,7.058]],["t/228",[127,4.379,130,6.025,131,4.792]],["t/230",[132,6.025,133,6.025,134,6.025]],["t/235",[42,4.522]],["t/237",[39,5.787]],["t/240",[42,3.747,48,3.953]],["t/242",[135,5.837,136,6.116]],["t/244",[49,3.541,136,6.116]],["t/246",[25,5.221,137,4.792,138,5.54]],["t/248",[15,3.049,62,4.273,136,5.221]],["t/250",[29,3.455,139,4.498,140,5.54]],["t/252",[29,4.048,140,6.49]],["t/261",[74,4.982,91,4.498,141,4.013]],["t/263",[49,2.636,141,3.5,142,3.437,143,2.735]],["t/265",[74,4.982,144,4.092,145,6.025]],["t/269",[146,6.116,147,7.058]],["t/271",[74,4.982,144,4.092,148,4.633]],["t/272",[73,3.022,144,4.092,149,5.54]],["t/274",[75,3.022,105,4.792,150,6.025]],["t/276",[123,4.895,151,6.49]],["t/280",[152,4.895,153,6.116]],["t/282",[152,4.895,154,7.058]],["t/284",[3,2.83,155,4.982,156,6.025]],["t/286",[82,4.18,122,4.346,157,4.554,158,5.255]],["t/289",[139,3.923,159,4.346,160,4.832,161,3.377]],["t/291",[32,2.565,139,4.498,159,4.982]],["t/293",[162,7.834]],["t/297",[5,2.995,14,3.387,73,2.338,163,3.584,164,3.706]],["t/298",[15,3.049,52,4.633,165,4.633]],["t/300",[1,2.921,165,4.633,166,6.025]],["t/302",[15,3.049,32,2.565,165,4.633]],["t/304",[5,3.377,14,3.82,75,2.636,127,3.82]],["t/306",[167,6.776]],["t/310",[135,4.982,152,4.178,168,5.221]],["t/312",[15,2.66,62,3.727,152,3.645,168,4.554]],["t/314",[64,4.393,169,7.058]],["t/315",[3,2.468,62,3.727,67,3.645,170,5.255]],["t/317",[3,2.468,29,3.014,30,3.727,31,3.645]],["t/321",[110,4.895,171,6.49]],["t/322",[17,3.747,48,3.953]],["t/324",[172,4.633,173,4.498,174,5.221]],["t/326",[175,5.54,176,4.498,177,3.809]],["t/328",[175,6.49,177,4.462]],["t/330",[178,6.49,179,7.058]],["t/332",[178,6.49,180,7.058]],["t/337",[42,4.522]],["t/339",[50,4.498,181,5.221,182,5.221]],["t/341",[172,5.428,183,3.909]],["t/345",[17,4.522]],["t/347",[50,4.498,89,3.414,181,5.221]],["t/349",[94,3.336,123,4.178,184,5.54]],["t/352",[17,3.747,48,3.953]],["t/354",[59,4.462,185,6.116]],["t/357",[42,4.522]],["t/359",[125,5.006,186,5.428]],["t/361",[172,5.428,183,3.909]],["t/365",[187,4.522]],["t/367",[188,8.52]],["t/373",[17,4.522]],["t/375",[50,4.498,89,3.414,181,5.221]],["t/378",[32,2.237,189,4.832,190,5.255,191,4.346]],["t/380",[32,2.237,36,5.187,192,4.832]],["t/382",[32,1.984,35,3.479,36,3.165,192,4.285,193,4.66]],["t/384",[43,3.94,194,6.025,195,6.025]],["t/386",[196,5.221,197,5.221,198,4.792]],["t/388",[48,3.374,152,4.178,199,5.54]],["t/390",[3,3.315,198,5.614]],["t/392",[198,5.614,200,6.49]],["t/400",[117,5.614,201,6.49]],["t/402",[117,5.614,202,6.49]],["t/404",[94,2.318,110,2.903,203,3.462,204,3.849,205,4.186,206,2.372]],["t/408",[5,3.377,73,2.636,176,3.923,177,3.322]],["t/410",[5,3.377,75,2.636,94,2.91,206,2.978]],["t/416",[117,5.614,201,6.49]],["t/418",[5,3.377,73,2.636,176,3.923,177,3.322]],["t/420",[5,3.377,75,2.636,94,2.91,206,2.978]],["t/422",[117,5.614,202,6.49]],["t/425",[32,2.237,42,2.79,48,2.943,207,4.18]],["t/427",[19,4.265,208,6.116]],["t/429",[72,4.498,209,6.025,210,5.221]],["t/431",[15,3.573,211,5.006]],["t/432",[15,3.049,51,4.379,79,5.221]],["t/434",[15,3.049,51,4.379,200,5.54]],["t/436",[15,3.049,211,4.273,212,4.092]],["t/438",[213,8.52]],["t/441",[187,4.522]],["t/443",[94,4.718]],["t/445",[173,6.36]],["t/447",[6,5.302]],["t/449",[214,8.52]],["t/451",[215,5.837,216,7.058]],["t/453",[215,5.837,217,7.058]],["t/455",[218,8.52]],["t/457",[88,5.13,219,7.058]],["t/460",[43,4.616,220,5.269]],["t/462",[32,1.617,59,2.402,73,1.906,187,2.017,221,3.292,222,3.494,223,2.296]],["t/464",[32,1.617,59,2.402,75,1.906,187,2.017,221,3.292,223,2.296,224,3.022]],["t/466",[35,3.479,36,5.695,225,4.285]],["t/468",[32,3.005,49,3.541]],["t/470",[226,6.116,227,7.058]],["t/474",[155,3.854,176,3.479,177,2.946,228,3.479,229,4.66]],["t/476",[155,3.854,176,3.479,177,2.946,228,3.479,230,4.66]],["t/478",[155,3.854,176,3.479,177,2.946,228,3.479,231,4.66]],["t/481",[61,4.498,174,5.221,232,5.221]],["t/483",[27,4.633,174,5.221,232,5.221]],["t/485",[233,6.025,234,6.025,235,4.633]],["t/487",[235,4.633,236,6.025,237,6.025]],["t/489",[172,5.428,232,6.116]],["t/491",[3,3.315,65,6.116]],["t/493",[3,3.315,65,6.116]],["t/497",[223,4.265,238,7.058]],["t/499",[168,6.116,223,4.265]],["t/501",[88,5.13,223,4.265]],["t/505",[15,3.049,49,3.022,239,6.025]],["t/506",[164,6.776]],["t/508",[163,6.552]],["t/510",[162,7.834]],["t/512",[240,8.52]],["t/517",[42,3.747,48,3.953]],["t/519",[40,4.895,41,5.006]],["t/521",[41,5.006,241,7.058]],["t/523",[17,3.747,48,3.953]],["t/525",[125,5.006,186,5.428]],["t/527",[161,4.536,186,5.428]],["t/531",[6,3.749,73,3.022,242,6.025]],["t/533",[17,4.522]],["t/535",[15,2.66,211,3.727,243,4.18,244,4.554]],["t/537",[143,3.136,243,4.792,244,5.221]],["t/539",[75,3.022,89,3.414,245,6.025]],["t/540",[17,4.522]],["t/542",[141,4.701,182,6.116]],["t/545",[17,3.747,48,3.953]],["t/547",[3,3.315,206,3.999]],["t/552",[42,4.522]],["t/554",[49,2.636,89,2.978,246,5.255,247,4.554]],["t/556",[49,3.541,248,6.116]],["t/558",[131,4.18,247,4.554,249,4.832,250,5.255]],["t/560",[244,6.116,248,6.116]],["t/561",[3,2.468,29,3.014,31,3.645,142,3.437]],["t/563",[3,2.468,29,3.014,31,3.645,142,3.437]],["t/565",[17,3.747,251,7.058]],["t/569",[252,7.834]],["t/571",[32,3.005,253,5.837]],["t/573",[254,5.837,255,7.058]],["t/575",[253,5.837,256,6.49]],["t/577",[257,5.614,258,5.13]],["t/579",[32,3.005,41,5.006]],["t/581",[41,5.006,256,6.49]],["t/583",[39,5.787]],["t/586",[42,3.747,48,3.953]],["t/588",[64,3.749,220,4.498,259,4.792]],["t/590",[73,3.541,260,7.058]],["t/592",[75,3.541,261,5.614]],["t/594",[76,3.785,262,6.116]],["t/596",[263,8.52]],["t/599",[42,3.747,48,3.953]],["t/601",[1,2.259,32,1.984,73,2.338,264,4.038,265,3.854]],["t/602",[32,2.237,73,3.831,207,4.18]],["t/604",[19,4.265,208,6.116]],["t/606",[32,2.237,73,2.636,75,2.636,266,4.554]],["t/608",[75,2.636,264,4.554,267,3.569,268,4.18]],["t/609",[32,2.237,73,2.636,75,2.636,269,4.832]],["t/611",[32,2.237,75,3.831,270,5.255]],["t/614",[42,3.747,48,3.953]],["t/616",[1,1.842,32,1.617,73,1.906,99,2.922,243,3.022,254,3.142,271,3.292]],["t/618",[1,2.529,64,1.996,75,1.609,224,2.551,271,2.779,272,3.207,273,2.779,274,3.207]],["t/619",[27,4.633,28,4.982,275,6.025]],["t/621",[27,3.584,28,3.854,172,3.584,276,4.038,277,4.66]],["t/624",[42,3.747,48,3.953]],["t/625",[32,3.005,207,5.614]],["t/627",[42,2.474,176,3.479,177,2.946,278,3.584,279,4.66]],["t/629",[257,5.614,280,6.49]],["t/631",[64,5.302]],["t/633",[64,4.393,135,5.837]],["t/635",[62,4.273,64,3.749,281,4.982]],["t/639",[161,4.536,282,6.49]],["t/641",[142,4.616,161,4.536]],["t/645",[187,3.747,278,5.428]],["t/647",[1,2.921,73,3.022,283,6.025]],["t/649",[1,2.548,6,3.271,75,2.636,228,3.923]],["t/651",[1,2.548,76,2.818,177,3.322,228,3.923]],["t/653",[1,2.921,6,3.749,284,4.092]],["t/655",[1,2.921,177,3.809,285,4.633]],["t/663",[42,4.522]],["t/665",[89,2.978,94,2.91,184,4.832,186,4.042]],["t/667",[89,2.978,94,2.91,186,4.042,271,4.554]],["t/669",[125,5.006,186,5.428]],["t/671",[161,5.476]],["t/675",[49,3.022,141,4.013,143,3.136]],["t/677",[286,7.058,287,6.49]],["t/679",[67,4.895,120,5.269]],["t/681",[288,7.383]],["t/683",[289,6.49,290,6.49]],["t/687",[49,3.022,143,3.136,265,4.982]],["t/689",[81,3.132,143,2.735,223,3.176,291,4.832]],["t/691",[67,4.895,120,5.269]],["t/693",[289,6.49,290,6.49]],["t/697",[131,4.18,183,2.91,187,2.79,292,4.554]],["t/699",[293,7.058,294,6.116]],["t/701",[67,4.895,295,7.058]],["t/703",[72,6.36]],["t/705",[167,5.614,296,7.058]],["t/708",[267,4.092,281,4.982,297,4.982]],["t/712",[298,7.058,299,5.837]],["t/714",[22,4.792,187,3.198,223,3.641]],["t/716",[300,6.776]],["t/718",[299,5.837,301,6.116]],["t/720",[276,5.221,299,4.982,301,5.221]],["t/722",[0,4.092,299,4.982,301,5.221]],["t/726",[89,2.641,141,3.104,294,4.038,302,3.854,303,4.285]],["t/727",[1,2.259,187,2.474,267,3.165,304,4.285,305,3.854]],["t/729",[141,3.5,143,2.735,294,4.554,306,5.255]],["t/731",[15,2.359,284,3.165,307,3.854,308,4.285,309,4.038]],["t/733",[73,3.541,310,7.058]],["t/735",[75,3.541,311,4.701]],["t/737",[76,3.785,183,3.909]],["t/739",[284,4.794,312,6.49]],["t/741",[62,4.273,64,3.749,313,6.025]],["t/743",[314,8.52]],["t/746",[125,5.006,267,4.794]],["t/748",[73,3.022,253,4.982,315,6.025]],["t/750",[75,3.022,316,6.025,317,5.221]],["t/752",[6,3.749,89,3.414,317,5.221]],["t/754",[89,3.414,177,3.809,317,5.221]],["t/756",[76,3.785,318,6.49]],["t/758",[6,3.271,89,2.978,258,3.82,319,4.554]],["t/760",[89,2.978,177,3.322,258,3.82,319,4.554]],["t/762",[5,3.377,177,3.322,288,4.554,319,4.554]],["t/764",[253,4.346,284,3.569,320,5.255,321,5.255]],["t/766",[6,3.271,89,2.978,257,4.18,258,3.82]],["t/768",[89,2.978,177,3.322,257,4.18,258,3.82]],["t/770",[139,3.479,285,3.584,318,4.285,322,4.66,323,4.66]],["t/772",[259,4.792,267,4.092,324,5.221]],["t/774",[1,2.259,224,3.706,247,4.038,267,3.165,325,4.66]],["t/777",[17,3.747,48,3.953]],["t/779",[3,3.315,206,3.999]],["t/781",[326,7.834]],["t/783",[327,7.834]],["t/786",[91,6.36]],["t/788",[42,3.747,48,3.953]],["t/790",[67,5.909]],["t/792",[42,2.017,262,3.292,328,3.494,329,3.799,330,3.494,331,3.799,332,3.292]],["t/794",[333,7.834]],["t/797",[334,7.058,335,6.116]],["t/799",[14,3.82,37,4.042,137,4.18,336,4.18]],["t/801",[49,3.022,93,4.792,336,4.792]],["t/803",[93,4.792,144,4.092,336,4.792]],["t/805",[49,3.541,336,5.614]],["t/807",[212,4.794,336,5.614]],["t/809",[14,3.82,32,2.237,37,4.042,337,4.18]],["t/810",[338,7.058,339,6.116]],["t/812",[49,3.022,93,4.792,337,4.792]],["t/814",[93,4.792,144,4.092,337,4.792]],["t/816",[49,3.541,337,5.614]],["t/818",[212,4.794,337,5.614]],["t/828",[340,8.52]],["t/829",[341,6.025,342,6.025,343,5.54]],["t/831",[300,5.614,344,7.058]],["t/833",[345,8.52]],["t/837",[42,3.747,48,3.953]],["t/838",[15,3.049,73,3.022,346,6.025]],["t/840",[15,3.049,75,3.022,347,5.221]],["t/842",[32,2.565,76,3.231,348,5.54]],["t/844",[32,1.984,284,3.165,347,4.038,349,4.285,350,4.66]],["t/846",[32,1.984,285,3.584,349,4.285,351,4.66,352,4.285]],["t/848",[1,2.921,183,3.336,353,6.025]],["t/850",[191,5.837,354,7.058]],["t/852",[1,3.422,7,5.006]],["t/854",[267,4.794,281,5.837]],["t/858",[49,2.636,73,2.636,223,3.176,355,4.832]],["t/860",[75,2.338,89,2.641,159,3.854,356,3.387,357,4.66]],["t/862",[5,2.442,76,2.037,89,3.385,258,2.761,356,2.761,358,3.142]],["t/868",[11,5.006,223,4.265]],["t/869",[11,5.006,264,6.116]],["t/871",[12,6.116,17,3.747]],["t/873",[11,4.273,99,4.633,223,3.641]],["t/874",[42,4.522]],["t/876",[333,7.834]],["t/878",[3,2.189,29,2.672,30,3.305,31,3.232,142,3.047]],["t/880",[3,2.189,29,2.672,30,3.305,31,3.232,142,3.047]],["t/882",[10,4.832,11,3.727,84,4.554,157,4.554]],["t/884",[356,4.379,359,6.025,360,6.025]],["t/886",[119,5.54,361,6.025,362,6.025]],["t/888",[17,3.747,161,4.536]],["t/890",[25,5.221,40,4.178,363,6.025]],["t/892",[11,5.006,364,7.058]],["t/896",[1,2.921,355,5.54,365,4.273]],["t/897",[366,8.52]],["t/899",[]],["t/901",[367,8.52]],["t/903",[368,8.52]],["t/905",[369,8.52]],["t/907",[370,8.52]],["t/909",[371,8.52]],["t/911",[372,8.52]],["t/913",[365,4.273,373,6.025,374,5.54]],["t/914",[99,6.552]],["t/916",[375,8.52]],["t/918",[376,8.52]],["t/920",[377,8.52]],["t/924",[15,3.573,378,6.49]],["t/926",[1,2.548,7,3.727,15,2.66,378,4.832]],["t/928",[15,3.573,379,7.058]],["t/935",[42,3.747,48,3.953]],["t/937",[3,4.001]],["t/939",[3,4.001]],["t/941",[39,5.787]],["t/943",[83,3.322,163,4.042,220,3.923,380,4.554]],["t/945",[87,6.116,381,7.058]],["t/948",[91,6.36]],["t/950",[39,5.787]],["t/952",[382,8.52]],["t/954",[383,8.52]],["t/956",[165,5.428,384,6.49]],["t/958",[49,3.541,385,6.49]],["t/960",[49,3.541,386,7.058]],["t/962",[15,2.66,49,2.636,187,2.79,211,3.727]],["t/964",[15,2.66,49,2.636,187,2.79,211,3.727]],["t/966",[17,4.522]],["t/968",[61,3.479,141,3.104,144,3.165,385,4.285,387,4.66]],["t/972",[388,8.52]],["t/973",[365,4.273,389,5.54,390,6.025]],["t/975",[365,5.006,391,7.058]],["t/977",[144,4.794,392,7.058]],["t/979",[393,7.046]],["t/981",[394,8.52]],["t/984",[42,3.747,73,3.541]],["t/985",[73,3.831,395,4.832,396,4.832]],["t/987",[72,4.498,73,3.022,75,3.022]],["t/989",[43,3.437,73,2.636,76,2.818,397,4.346]],["t/991",[75,3.022,356,4.379,398,4.792]],["t/993",[73,2.1,75,2.1,220,3.125,307,3.462,356,3.042,398,3.329]],["t/995",[75,3.831,115,4.832,399,4.832]],["t/997",[39,4.092,75,3.022,76,3.231]],["t/999",[51,3.82,76,2.818,141,3.5,400,4.18]],["t/1001",[51,3.042,73,2.1,76,2.245,90,2.646,141,2.788,401,4.186]],["t/1003",[75,2.338,76,2.499,90,2.946,141,3.104,400,3.706]],["t/1005",[76,3.748,90,2.946,400,5.558]],["t/1007",[15,3.049,52,4.633,284,4.092]],["t/1009",[285,5.428,402,7.058]],["t/1011",[403,5.54,404,5.54,405,4.982]],["t/1013",[309,6.116,406,5.837]],["t/1015",[73,3.541,406,5.837]],["t/1017",[75,3.541,406,5.837]],["t/1019",[407,5.837,408,6.116]],["t/1021",[15,2.359,73,2.338,407,3.854,408,4.038,409,4.038]],["t/1023",[15,2.359,59,2.946,75,2.338,407,3.854,408,4.038]],["t/1025",[152,4.178,410,5.54,411,6.025]],["t/1027",[32,2.565,405,4.982,412,4.633]],["t/1029",[32,2.237,73,2.636,171,4.832,412,4.042]],["t/1031",[32,2.237,75,2.636,412,4.042,413,4.18]],["t/1033",[6,3.271,76,2.818,90,3.322,412,4.042]],["t/1035",[90,3.322,284,3.569,412,4.042,414,4.346]],["t/1037",[88,4.379,110,4.178,415,4.792]],["t/1038",[73,2.338,88,3.387,91,3.479,110,3.232,415,3.706]],["t/1040",[75,2.636,223,3.176,415,4.18,416,5.255]],["t/1042",[22,3.706,76,2.499,81,2.777,131,3.706,415,3.706]],["t/1044",[284,3.569,328,4.832,399,4.832,415,4.18]],["t/1046",[335,6.116,417,5.428]],["t/1047",[17,2.79,48,2.943,73,2.636,417,4.042]],["t/1049",[75,2.636,262,4.554,335,4.554,417,4.042]],["t/1051",[76,2.818,131,4.18,393,4.346,417,4.042]],["t/1053",[163,3.219,164,3.329,225,3.849,284,2.843,417,3.219,418,3.849]],["t/1055",[61,4.498,144,4.092,419,6.025]],["t/1057",[303,5.54,417,4.633,420,6.025]],["t/1060",[161,3.872,196,5.221,197,5.221]],["t/1062",[421,7.046]],["t/1064",[422,8.52]],["t/1068",[160,6.49,423,7.058]],["t/1070",[146,6.116,177,4.462]],["t/1072",[39,5.787]],["t/1080",[42,3.747,48,3.953]],["t/1082",[206,3.999,424,7.058]],["t/1086",[3,3.315,384,6.49]],["t/1087",[49,3.541,425,6.49]],["t/1089",[81,4.207,426,7.058]],["t/1091",[15,3.573,137,5.614]],["t/1093",[32,3.005,343,6.49]],["t/1095",[172,4.633,273,5.221,427,4.982]],["t/1097",[109,3.727,273,4.554,427,4.346,428,4.832]],["t/1099",[109,5.006,429,7.058]],["t/1101",[5,3.377,109,3.727,430,5.255,431,5.255]],["t/1103",[32,3.005,34,5.837]],["t/1105",[185,5.221,427,4.982,432,5.54]],["t/1107",[109,3.727,427,4.346,428,4.832,432,4.832]],["t/1109",[109,5.006,433,7.058]],["t/1111",[109,5.006,434,7.058]],["t/1114",[435,8.52]],["t/1116",[196,3.627,197,3.627,210,3.627,302,3.462,436,3.462,437,3.849]],["t/1118",[94,2.91,206,2.978,302,4.346,437,4.832]],["t/1120",[206,3.999,438,7.058]],["t/1122",[206,3.999,439,7.058]],["t/1125",[17,4.522]],["t/1127",[261,5.614,440,6.49]],["t/1131",[73,3.541,441,6.49]],["t/1133",[75,3.541,441,6.49]],["t/1136",[1,2.259,32,1.984,94,2.581,442,4.66,443,4.038]],["t/1138",[4,2.684,32,2.237,94,2.91,305,4.346]],["t/1140",[4,2.684,94,2.91,167,4.18,187,2.79]],["t/1142",[3,1.784,32,1.617,73,1.906,90,2.402,94,2.104,444,2.329,445,3.494]],["t/1144",[75,1.906,90,2.402,94,2.104,187,2.017,222,3.494,444,2.329,445,3.494]],["t/1147",[73,3.541,142,4.616]],["t/1149",[75,3.022,191,4.982,446,6.025]],["t/1150",[258,4.379,395,5.54,396,5.54]],["t/1152",[447,6.116,448,6.49]],["t/1154",[76,3.231,90,3.809,449,5.54]],["t/1156",[73,2.636,76,2.818,203,4.346,443,4.554]],["t/1158",[7,4.273,75,3.022,76,3.231]],["t/1160",[76,4.095,267,3.569,281,4.346]],["t/1162",[76,2.818,127,3.82,284,3.569,436,4.346]],["t/1164",[11,4.273,76,3.231,285,4.633]],["t/1166",[2,3.694,76,3.231,403,5.54]],["t/1168",[47,3.091,76,2.818,135,4.346,406,4.346]],["t/1170",[76,2.818,248,4.554,374,4.832,407,4.346]],["t/1172",[40,3.645,41,3.727,76,2.818,410,4.832]],["t/1174",[32,2.237,76,2.818,412,4.042,450,5.255]],["t/1176",[284,4.794,451,7.058]],["t/1178",[39,4.794,285,5.428]],["t/1181",[268,5.614,311,4.701]],["t/1184",[452,8.52]],["t/1186",[82,4.792,228,4.498,268,4.792]],["t/1188",[29,3.014,33,3.82,89,2.978,308,4.832]],["t/1191",[17,3.747,48,3.953]],["t/1193",[39,4.092,84,5.221,163,4.633]],["t/1195",[50,4.498,94,3.336,365,4.273]],["t/1198",[292,6.116,453,7.058]],["t/1200",[17,4.522]],["t/1201",[49,3.022,206,3.414,226,5.221]],["t/1203",[3,2.83,206,3.414,226,5.221]],["t/1209",[152,5.909]],["t/1211",[17,4.522]],["t/1212",[47,3.543,187,3.198,447,5.221]],["t/1214",[1,2.921,32,2.565,47,3.543]],["t/1216",[40,3.645,41,3.727,47,3.091,97,4.346]],["t/1218",[40,3.645,41,3.727,47,3.091,254,4.346]],["t/1222",[32,2.565,34,4.982,292,5.221]],["t/1224",[34,3.854,206,2.641,297,3.854,448,4.285,454,4.285]],["t/1226",[297,4.982,454,5.54,455,6.025]],["t/1228",[444,4.327,456,6.116]],["t/1230",[94,3.909,457,6.49]],["t/1232",[81,4.207,83,4.462]],["t/1234",[4,2.38,5,2.995,62,3.305,94,2.581,458,4.66]],["t/1236",[113,5.221,444,3.694,457,5.54]],["t/1238",[459,8.52]],["t/1241",[460,7.383]],["t/1243",[461,8.52]],["t/1246",[138,4.832,152,3.645,462,4.832,463,5.255]],["t/1248",[47,4.151,49,3.541]],["t/1250",[29,3.455,47,3.543,64,3.749]],["t/1252",[29,3.014,47,3.091,64,3.271,276,4.554]],["t/1254",[1,2.548,47,3.091,447,4.554,460,4.554]],["t/1256",[1,2.921,32,2.565,47,3.543]],["t/1258",[47,4.151,464,7.058]],["t/1260",[47,3.543,61,4.498,347,5.221]],["t/1262",[465,8.52]],["t/1264",[466,8.52]],["t/1266",[47,4.151,467,7.058]],["t/1268",[2,3.694,50,4.498,51,4.379]],["t/1272",[81,3.132,83,3.322,142,3.437,436,4.346]],["t/1274",[300,6.776]],["t/1276",[243,5.614,261,5.614]],["t/1280",[73,2.338,161,2.995,468,4.66,469,3.706,470,4.038]],["t/1282",[75,2.636,90,3.322,161,3.377,471,5.255]],["t/1285",[42,4.522]],["t/1287",[161,5.476]],["t/1291",[49,3.022,143,3.136,265,4.982]],["t/1293",[81,3.132,143,2.735,223,3.176,291,4.832]],["t/1295",[1,2.921,4,3.077,143,3.136]],["t/1296",[3,3.315,472,7.058]],["t/1298",[3,2.83,4,3.077,88,4.379]],["t/1301",[17,4.522]],["t/1302",[42,3.747,48,3.953]],["t/1304",[72,5.269,473,7.058]],["t/1306",[206,3.999,474,7.058]],["t/1307",[6,2.9,32,1.984,47,2.741,220,3.479,307,3.854]],["t/1309",[43,4.616,475,6.49]],["t/1311",[43,4.616,397,5.837]],["t/1313",[206,3.999,476,7.058]],["t/1315",[6,2.9,32,1.984,47,2.741,220,3.479,307,3.854]],["t/1317",[43,4.616,475,6.49]],["t/1319",[43,4.616,397,5.837]],["t/1324",[110,4.178,137,4.792,212,4.092]],["t/1326",[59,3.809,110,4.178,212,4.092]],["t/1328",[110,4.178,137,4.792,212,4.092]],["t/1330",[15,3.573,404,6.49]],["t/1333",[1,2.921,7,4.273,477,6.025]],["t/1335",[1,2.921,3,2.83,7,4.273]],["t/1337",[224,4.792,282,5.54,478,6.025]],["t/1343",[99,5.428,479,7.058]],["t/1345",[123,5.909]],["t/1347",[99,5.428,480,7.058]],["t/1350",[211,6.043]],["t/1352",[22,4.18,61,3.923,161,3.377,187,2.79]],["t/1354",[15,3.049,211,4.273,212,4.092]],["t/1356",[198,6.776]],["t/1358",[89,3.999,481,6.49]],["t/1360",[49,3.541,187,3.747]],["t/1362",[15,3.049,198,4.792,212,4.092]],["t/1365",[469,5.614,482,7.058]],["t/1367",[469,5.614,483,7.058]],["t/1369",[183,2.581,311,3.104,330,4.285,484,6.056]],["t/1371",[167,6.776]],["t/1373",[312,6.49,470,6.116]],["t/1374",[235,5.428,485,7.058]],["t/1376",[125,5.006,470,6.116]],["t/1378",[257,5.614,302,5.837]],["t/1380",[101,7.834]],["t/1381",[173,5.269,409,6.116]],["t/1383",[59,4.462,173,5.269]],["t/1385",[105,6.776]],["t/1387",[]],["t/1388",[]],["t/1390",[]],["t/1392",[]],["t/1394",[365,5.006,486,7.058]],["t/1396",[90,4.462,460,6.116]],["t/1398",[487,8.52]],["t/1400",[488,8.52]],["t/1402",[235,6.552]],["t/1404",[52,5.428,235,5.428]],["t/1406",[235,5.428,489,7.058]],["t/1410",[1,2.548,6,3.271,32,2.237,212,3.569]],["t/1412",[19,3.641,21,4.982,490,5.54]],["t/1414",[19,3.641,38,4.498,491,5.54]],["t/1416",[1,2.548,32,2.237,45,4.832,212,3.569]],["t/1418",[19,3.641,21,4.982,490,5.54]],["t/1420",[19,3.641,38,4.498,491,5.54]],["t/1422",[94,3.336,110,4.178,212,4.092]],["t/1424",[32,2.565,64,3.749,492,6.025]],["t/1425",[493,8.52]],["t/1427",[32,2.565,62,4.273,494,5.221]],["t/1429",[15,3.049,47,3.543,62,4.273]],["t/1433",[105,5.614,440,6.49]],["t/1435",[43,3.94,139,4.498,495,5.54]],["t/1437",[43,4.616,495,6.49]],["t/1440",[42,4.522]],["t/1442",[161,5.476]],["t/1444",[33,5.13,269,6.49]],["t/1446",[33,5.13,254,5.837]],["t/1449",[223,4.265,444,4.327]],["t/1450",[5,3.377,173,3.923,409,4.554,469,4.18]],["t/1452",[5,3.377,59,3.322,173,3.923,469,4.18]],["t/1454",[52,4.042,393,4.346,444,3.222,496,5.255]],["t/1456",[3,2.189,444,2.857,497,4.285,498,4.038,499,4.66]],["t/1458",[3,3.315,365,5.006]],["t/1460",[3,3.315,365,5.006]],["t/1462",[3,2.83,258,4.379,365,4.273]],["t/1464",[444,4.327,500,7.058]],["t/1467",[380,6.116,497,6.49]],["t/1469",[83,4.462,159,5.837]],["t/1473",[356,5.13,398,5.614]],["t/1475",[49,3.022,223,3.641,400,4.792]],["t/1477",[83,4.462,501,7.058]],["t/1479",[17,4.522]],["t/1481",[152,4.895,405,5.837]],["t/1482",[152,4.895,405,5.837]],["t/1484",[309,7.383]],["t/1486",[17,4.522]],["t/1488",[90,4.462,502,6.116]],["t/1489",[90,3.809,91,4.498,502,5.221]],["t/1491",[90,4.462,503,7.058]],["t/1493",[90,4.462,502,6.116]],["t/1495",[161,4.536,504,7.058]],["t/1497",[1,3.422,32,3.005]],["t/1499",[40,5.909]],["t/1506",[42,3.747,48,3.953]],["t/1508",[300,6.776]],["t/1511",[142,3.94,146,5.221,494,5.221]],["t/1513",[3,2.83,29,3.455,89,3.414]],["t/1515",[3,2.83,29,3.455,89,3.414]],["t/1516",[1,2.548,142,3.437,210,4.554,505,4.18]],["t/1518",[40,4.178,144,4.092,203,4.982]],["t/1520",[280,6.49,506,7.058]],["t/1522",[100,7.383]],["t/1524",[27,5.428,28,5.837]],["t/1526",[507,8.52]],["t/1528",[508,8.52]],["t/1530",[1,2.921,3,2.83,7,4.273]],["t/1535",[509,8.52]],["t/1537",[49,3.022,143,3.136,400,4.792]],["t/1539",[81,4.207,83,4.462]],["t/1541",[17,4.522]],["t/1545",[89,3.414,443,5.221,481,5.54]],["t/1547",[413,5.614,510,7.058]],["t/1549",[189,6.49,352,6.49]],["t/1551",[249,4.832,389,4.832,413,4.18,511,5.255]],["t/1553",[15,3.049,59,3.809,413,4.792]],["t/1560",[0,3.569,67,3.645,85,4.832,512,5.255]],["t/1562",[118,4.895,513,7.058]],["t/1564",[51,4.379,67,4.178,421,4.982]],["t/1566",[81,4.207,122,5.837]],["t/1568",[421,5.837,514,6.49]],["t/1570",[6,3.749,32,2.565,414,4.982]],["t/1573",[127,4.379,142,3.94,436,4.982]],["t/1575",[183,3.909,484,6.116]],["t/1577",[94,3.336,183,3.336,206,3.414]],["t/1578",[49,2.636,94,2.91,183,2.91,206,2.978]],["t/1580",[94,2.91,97,4.346,206,2.978,515,4.832]],["t/1582",[94,2.91,95,4.554,206,2.978,261,4.18]],["t/1584",[444,4.327,456,6.116]],["t/1585",[49,3.022,444,3.694,456,5.221]],["t/1587",[97,4.982,444,3.694,515,5.54]],["t/1589",[95,5.221,261,4.792,444,3.694]],["t/1592",[516,7.834]],["t/1594",[127,4.379,356,4.379,398,4.792]],["t/1598",[29,3.014,30,3.727,86,4.554,356,3.82]],["t/1600",[109,5.006,165,5.428]],["t/1602",[64,3.271,164,4.18,204,4.832,517,5.255]],["t/1604",[3,3.315,64,4.393]],["t/1606",[109,4.273,165,4.633,339,5.221]],["t/1609",[81,4.207,83,4.462]],["t/1611",[81,3.591,518,6.025,519,6.025]],["t/1615",[520,8.52]],["t/1617",[4,4.352]],["t/1619",[267,5.787]],["t/1620",[32,2.565,207,4.792,267,4.092]],["t/1622",[32,2.565,266,5.221,267,4.092]],["t/1624",[41,6.043]],["t/1627",[3,1.966,4,2.138,163,3.219,164,3.329,297,3.462,397,3.462]],["t/1629",[143,3.674,521,6.116]],["t/1631",[143,3.136,521,5.221,522,5.54]],["t/1633",[49,3.022,143,3.136,398,4.792]],["t/1635",[51,4.379,81,3.591,143,3.136]],["t/1637",[358,5.837,523,5.837]],["t/1638",[304,5.54,523,4.982,524,6.025]],["t/1640",[118,4.178,358,4.982,523,4.982]],["t/1642",[358,4.982,523,4.982,525,6.025]],["t/1644",[118,4.895,526,7.058]],["t/1646",[421,5.837,514,6.49]],["t/1648",[6,3.749,32,2.565,414,4.982]],["t/1650",[1,2.921,32,2.565,414,4.982]],["t/1654",[17,3.747,48,3.953]],["t/1656",[1,2.548,4,2.684,73,2.636,98,4.832]],["t/1658",[1,2.548,32,2.237,75,2.636,348,4.832]],["t/1660",[4,3.077,76,3.231,413,4.792]],["t/1662",[83,3.809,380,5.221,527,4.633]],["t/1664",[149,6.49,527,5.428]],["t/1666",[288,6.116,527,5.428]],["t/1672",[187,3.747,528,7.058]],["t/1674",[187,2.79,199,4.832,221,4.554,516,4.832]],["t/1676",[187,3.198,223,3.641,278,4.633]],["t/1677",[37,6.552]],["t/1679",[19,5.149]],["t/1681",[38,6.36]],["t/1686",[32,3.005,266,6.116]],["t/1688",[118,4.895,143,3.674]],["t/1690",[81,4.207,83,4.462]],["t/1692",[118,4.178,120,4.498,148,4.633]],["t/1695",[42,4.522]],["t/1697",[43,5.571]],["t/1699",[300,6.776]],["t/1701",[191,4.982,224,4.792,529,6.025]],["t/1703",[39,4.092,305,4.982,530,6.025]],["t/1706",[32,3.005,207,5.614]],["t/1708",[19,4.265,208,6.116]],["t/1710",[49,3.022,141,4.013,143,3.136]],["t/1712",[81,4.207,83,4.462]],["t/1714",[118,4.178,120,4.498,148,4.633]],["t/1718",[32,2.237,49,2.636,110,3.645,139,3.923]],["t/1720",[19,2.816,21,3.854,32,1.984,35,3.479,36,3.165]],["t/1722",[19,2.816,32,1.984,35,3.479,36,3.165,37,3.584]],["t/1724",[19,2.816,32,1.984,36,4.747,38,3.479]],["t/1726",[19,2.816,32,1.984,36,4.747,38,3.479]],["t/1728",[278,4.633,425,5.54,449,5.54]],["t/1730",[61,6.36]],["t/1736",[252,7.834]],["t/1738",[43,3.94,332,5.221,531,6.025]],["t/1739",[49,3.022,141,4.013,143,3.136]],["t/1741",[81,4.207,83,4.462]],["t/1743",[118,4.178,120,4.498,148,4.633]],["t/1745",[43,3.94,332,5.221,532,6.025]],["t/1746",[339,7.383]],["t/1748",[118,4.895,143,3.674]],["t/1750",[81,4.207,83,4.462]],["t/1752",[118,4.178,120,4.498,148,4.633]],["t/1755",[533,8.52]],["t/1758",[143,2.425,418,4.285,521,4.038,522,4.285,534,4.66]],["t/1760",[64,3.749,86,5.221,535,6.025]],["t/1762",[81,3.132,187,2.79,215,4.346,278,4.042]],["t/1764",[536,7.058,537,6.49]],["t/1766",[537,6.49,538,7.058]],["t/1770",[539,8.52]],["t/1772",[91,5.269,161,4.536]],["t/1774",[2,3.694,125,4.273,139,4.498]],["t/1776",[2,4.327,125,5.006]],["t/1778",[326,6.49,540,7.058]],["t/1780",[327,6.49,541,7.058]],["t/1782",[39,5.787]],["t/1786",[4,3.077,59,3.809,173,4.498]],["t/1788",[1,2.548,4,2.684,15,2.66,228,3.923]],["t/1790",[542,7.058,543,7.058]],["t/1796",[4,3.077,183,3.336,187,3.198]],["t/1798",[4,3.077,143,3.136,311,4.013]],["t/1801",[4,3.077,183,3.336,187,3.198]],["t/1803",[4,3.077,143,3.136,311,4.013]],["t/1807",[4,3.077,183,3.336,187,3.198]],["t/1808",[15,3.573,211,5.006]],["t/1810",[15,3.573,211,5.006]],["t/1812",[4,3.077,143,3.136,311,4.013]],["t/1816",[3,2.83,153,5.221,305,4.982]],["t/1818",[29,3.014,33,3.82,544,5.255,545,5.255]],["t/1820",[1,2.548,33,3.82,153,4.554,287,4.832]],["t/1822",[1,2.259,3,2.189,33,5.079,546,4.66]],["t/1827",[4,3.077,183,3.336,187,3.198]],["t/1829",[4,3.077,143,3.136,311,4.013]],["t/1833",[4,3.077,183,3.336,187,3.198]],["t/1835",[4,3.077,143,3.136,311,4.013]],["t/1838",[59,3.809,498,5.221,547,6.025]],["t/1840",[59,3.809,498,5.221,548,5.54]],["t/1842",[5,3.872,33,4.379,444,3.694]],["t/1845",[1,2.548,220,3.923,223,3.176,505,4.18]],["t/1847",[3,2.83,142,3.94,505,4.792]],["t/1849",[3,2.468,29,3.014,89,2.978,505,4.18]],["t/1852",[4,3.077,183,3.336,187,3.198]],["t/1854",[4,3.077,143,3.136,311,4.013]],["t/1857",[4,3.077,183,3.336,187,3.198]],["t/1859",[4,3.077,143,3.136,311,4.013]],["t/1862",[549,6.025,550,6.025,551,6.025]],["t/1864",[127,5.13,552,7.058]],["t/1870",[4,3.077,183,3.336,187,3.198]],["t/1872",[4,3.077,143,3.136,311,4.013]],["t/1875",[553,6.49,554,7.058]],["t/1877",[393,5.837,555,7.058]],["t/1880",[17,4.522]],["t/1882",[324,6.116,556,6.49]],["t/1883",[94,2.91,123,3.645,206,2.978,557,4.18]],["t/1885",[94,2.91,123,3.645,206,2.978,557,4.18]],["t/1887",[94,2.91,123,3.645,206,2.978,557,4.18]],["t/1889",[553,5.54,558,6.025,559,6.025]],["t/1894",[17,4.522]],["t/1896",[324,6.116,556,6.49]],["t/1897",[8,5.614,444,4.327]],["t/1899",[123,4.178,444,3.694,557,4.792]],["t/1901",[123,4.178,444,3.694,557,4.792]],["t/1912",[4,3.077,183,3.336,187,3.198]],["t/1914",[4,3.077,143,3.136,311,4.013]],["t/1918",[3,2.83,47,3.543,59,3.809]],["t/1920",[47,3.543,59,3.809,548,5.54]],["t/1922",[40,5.909]],["t/1924",[560,8.52]],["t/1928",[215,7.046]],["t/1930",[187,3.747,278,5.428]],["t/1932",[561,7.058,562,7.058]],["t/1934",[144,4.794,148,5.428]],["t/1936",[0,3.569,142,3.437,182,4.554,563,5.255]],["t/1938",[4,2.684,40,3.645,144,3.569,203,4.346]],["t/1940",[123,4.895,151,6.49]],["t/1943",[3,3.315,564,7.058]],["t/1945",[3,2.83,183,3.336,484,5.221]],["t/1947",[167,6.776]],["t/1950",[13,4.792,29,3.455,87,5.221]],["t/1952",[3,2.468,29,3.014,30,3.727,31,3.645]],["t/1954",[3,2.468,29,3.014,30,3.727,31,3.645]],["t/1956",[157,6.116,565,7.058]],["t/1958",[59,3.809,89,3.414,566,6.025]],["t/1962",[49,3.022,143,3.136,265,4.982]],["t/1964",[81,3.132,143,2.735,223,3.176,243,4.18]],["t/1966",[4,3.077,143,3.136,223,3.641]],["t/1968",[3,2.468,185,4.554,259,4.18,527,4.042]],["t/1970",[49,2.338,88,3.387,259,3.706,462,4.285,527,3.584]],["t/1972",[27,3.584,49,2.338,88,3.387,259,3.706,527,3.584]],["t/1976",[183,4.718]],["t/1978",[183,3.909,206,3.999]],["t/1980",[183,3.909,268,5.614]],["t/1982",[4,3.605,505,5.614]],["t/1984",[1,3.422,7,5.006]],["t/1988",[183,4.718]],["t/1990",[183,3.909,206,3.999]],["t/1992",[444,5.223]],["t/1994",[183,3.909,268,5.614]],["t/1996",[494,7.383]],["t/1998",[1,3.422,7,5.006]]],"invertedIndex":[["0",{"_index":480,"t":{"1347":{"position":[[7,1]]}}}],["1",{"_index":73,"t":{"134":{"position":[[9,1]]},"272":{"position":[[0,1]]},"297":{"position":[[0,1]]},"408":{"position":[[0,1]]},"418":{"position":[[0,1]]},"462":{"position":[[0,1]]},"531":{"position":[[0,1]]},"590":{"position":[[0,1]]},"601":{"position":[[0,1]]},"602":{"position":[[0,1],[2,1]]},"606":{"position":[[0,1]]},"609":{"position":[[2,1]]},"616":{"position":[[0,1]]},"647":{"position":[[0,1]]},"733":{"position":[[0,1]]},"748":{"position":[[0,1]]},"838":{"position":[[0,1]]},"858":{"position":[[0,1]]},"984":{"position":[[0,1]]},"985":{"position":[[0,1],[2,1]]},"987":{"position":[[0,1]]},"989":{"position":[[0,1]]},"993":{"position":[[2,1]]},"1001":{"position":[[2,1]]},"1015":{"position":[[2,1]]},"1021":{"position":[[2,1]]},"1029":{"position":[[3,1]]},"1038":{"position":[[3,1]]},"1047":{"position":[[3,1]]},"1131":{"position":[[6,1]]},"1142":{"position":[[0,1]]},"1147":{"position":[[0,1]]},"1156":{"position":[[2,1]]},"1280":{"position":[[8,1]]},"1656":{"position":[[0,1]]}}}],["10",{"_index":412,"t":{"1027":{"position":[[0,2]]},"1029":{"position":[[0,2]]},"1031":{"position":[[0,2]]},"1033":{"position":[[0,2]]},"1035":{"position":[[0,2]]},"1174":{"position":[[2,2]]}}}],["11",{"_index":415,"t":{"1037":{"position":[[0,2]]},"1038":{"position":[[0,2]]},"1040":{"position":[[0,2]]},"1042":{"position":[[0,2]]},"1044":{"position":[[0,2]]}}}],["12",{"_index":417,"t":{"1046":{"position":[[0,2]]},"1047":{"position":[[0,2]]},"1049":{"position":[[0,2]]},"1051":{"position":[[0,2]]},"1053":{"position":[[0,2]]},"1057":{"position":[[0,2]]}}}],["13",{"_index":419,"t":{"1055":{"position":[[0,2]]}}}],["2",{"_index":75,"t":{"136":{"position":[[9,1]]},"274":{"position":[[0,1]]},"304":{"position":[[0,1]]},"410":{"position":[[0,1]]},"420":{"position":[[0,1]]},"464":{"position":[[0,1]]},"539":{"position":[[0,1]]},"592":{"position":[[0,1]]},"606":{"position":[[2,1]]},"608":{"position":[[0,1]]},"609":{"position":[[0,1]]},"611":{"position":[[0,1],[2,1]]},"618":{"position":[[0,1]]},"649":{"position":[[0,1]]},"735":{"position":[[0,1]]},"750":{"position":[[0,1]]},"840":{"position":[[0,1]]},"860":{"position":[[0,1]]},"987":{"position":[[2,1]]},"991":{"position":[[0,1]]},"993":{"position":[[0,1]]},"995":{"position":[[0,1],[2,1]]},"997":{"position":[[0,1]]},"1003":{"position":[[2,1]]},"1017":{"position":[[2,1]]},"1023":{"position":[[2,1]]},"1031":{"position":[[3,1]]},"1040":{"position":[[3,1]]},"1049":{"position":[[3,1]]},"1133":{"position":[[6,1]]},"1144":{"position":[[0,1]]},"1149":{"position":[[0,1]]},"1158":{"position":[[2,1]]},"1282":{"position":[[8,1]]},"1658":{"position":[[0,1]]}}}],["3",{"_index":76,"t":{"138":{"position":[[9,1]]},"594":{"position":[[0,1]]},"651":{"position":[[0,1]]},"737":{"position":[[0,1]]},"756":{"position":[[0,1]]},"842":{"position":[[0,1]]},"862":{"position":[[0,1]]},"989":{"position":[[2,1]]},"997":{"position":[[2,1]]},"999":{"position":[[0,1]]},"1001":{"position":[[0,1]]},"1003":{"position":[[0,1]]},"1005":{"position":[[0,1],[2,1]]},"1033":{"position":[[3,1]]},"1042":{"position":[[3,1]]},"1051":{"position":[[3,1]]},"1154":{"position":[[0,1]]},"1156":{"position":[[0,1]]},"1158":{"position":[[0,1]]},"1160":{"position":[[0,1],[2,1]]},"1162":{"position":[[0,1]]},"1164":{"position":[[0,1]]},"1166":{"position":[[0,1]]},"1168":{"position":[[0,1]]},"1170":{"position":[[0,1]]},"1172":{"position":[[0,1]]},"1174":{"position":[[0,1]]},"1660":{"position":[[0,1]]}}}],["4",{"_index":284,"t":{"653":{"position":[[0,1]]},"731":{"position":[[0,1]]},"739":{"position":[[0,1]]},"764":{"position":[[0,1]]},"844":{"position":[[0,1]]},"1007":{"position":[[0,1]]},"1035":{"position":[[3,1]]},"1044":{"position":[[3,1]]},"1053":{"position":[[3,1]]},"1162":{"position":[[2,1]]},"1176":{"position":[[0,1]]}}}],["5",{"_index":285,"t":{"655":{"position":[[0,1]]},"770":{"position":[[0,1]]},"846":{"position":[[0,1]]},"1009":{"position":[[0,1]]},"1164":{"position":[[2,1]]},"1178":{"position":[[0,1]]}}}],["6",{"_index":403,"t":{"1011":{"position":[[0,1]]},"1166":{"position":[[2,1]]}}}],["7",{"_index":406,"t":{"1013":{"position":[[0,1]]},"1015":{"position":[[0,1]]},"1017":{"position":[[0,1]]},"1168":{"position":[[2,1]]}}}],["8",{"_index":407,"t":{"1019":{"position":[[0,1]]},"1021":{"position":[[0,1]]},"1023":{"position":[[0,1]]},"1170":{"position":[[2,1]]}}}],["9",{"_index":410,"t":{"1025":{"position":[[0,1]]},"1172":{"position":[[2,1]]}}}],["absent",{"_index":321,"t":{"764":{"position":[[13,6]]}}}],["abstract",{"_index":462,"t":{"1246":{"position":[[8,8]]},"1970":{"position":[[7,8]]}}}],["abus",{"_index":213,"t":{"438":{"position":[[7,5]]}}}],["achiev",{"_index":445,"t":{"1142":{"position":[[37,7]]},"1144":{"position":[[3,7]]}}}],["action",{"_index":547,"t":{"1838":{"position":[[17,7]]}}}],["ad",{"_index":205,"t":{"404":{"position":[[30,5]]}}}],["add",{"_index":109,"t":{"197":{"position":[[0,3]]},"1097":{"position":[[0,3]]},"1099":{"position":[[0,3]]},"1101":{"position":[[0,3]]},"1107":{"position":[[0,3]]},"1109":{"position":[[0,3]]},"1111":{"position":[[0,3]]},"1600":{"position":[[0,3]]},"1606":{"position":[[0,3]]}}}],["addintochildnod",{"_index":434,"t":{"1111":{"position":[[4,17]]}}}],["addit",{"_index":517,"t":{"1602":{"position":[[0,10]]}}}],["advantag",{"_index":382,"t":{"952":{"position":[[0,10]]}}}],["aggreg",{"_index":460,"t":{"1241":{"position":[[0,11]]},"1254":{"position":[[7,9]]},"1396":{"position":[[0,9]]}}}],["allow",{"_index":113,"t":{"200":{"position":[[0,5]]},"202":{"position":[[0,5]]},"1236":{"position":[[8,7]]}}}],["allscalar",{"_index":402,"t":{"1009":{"position":[[3,10]]}}}],["ambigu",{"_index":295,"t":{"701":{"position":[[4,9]]}}}],["analysi",{"_index":512,"t":{"1560":{"position":[[15,8]]}}}],["analyt",{"_index":471,"t":{"1282":{"position":[[11,8]]}}}],["annot",{"_index":335,"t":{"797":{"position":[[11,10]]},"1046":{"position":[[4,11]]},"1049":{"position":[[5,10]]}}}],["anoth",{"_index":473,"t":{"1304":{"position":[[0,7]]}}}],["api",{"_index":67,"t":{"119":{"position":[[11,3]]},"121":{"position":[[19,4]]},"199":{"position":[[28,4]]},"315":{"position":[[14,3]]},"679":{"position":[[5,3]]},"691":{"position":[[5,3]]},"701":{"position":[[0,3]]},"790":{"position":[[0,4]]},"1560":{"position":[[11,3]]},"1564":{"position":[[5,3]]}}}],["append",{"_index":260,"t":{"590":{"position":[[3,6]]}}}],["appli",{"_index":244,"t":{"535":{"position":[[14,7]]},"537":{"position":[[14,7]]},"560":{"position":[[0,5]]}}}],["applic",{"_index":397,"t":{"989":{"position":[[5,11]]},"1311":{"position":[[0,10]]},"1319":{"position":[[0,10]]},"1627":{"position":[[12,12]]}}}],["applypar",{"_index":431,"t":{"1101":{"position":[[17,11]]}}}],["approach",{"_index":53,"t":{"96":{"position":[[7,8]]},"98":{"position":[[7,8]]}}}],["architectur",{"_index":63,"t":{"113":{"position":[[18,12]]}}}],["argument",{"_index":548,"t":{"1840":{"position":[[22,9]]},"1920":{"position":[[21,9]]}}}],["array",{"_index":238,"t":{"497":{"position":[[0,5]]}}}],["articl",{"_index":78,"t":{"138":{"position":[[26,7]]}}}],["associ",{"_index":32,"t":{"59":{"position":[[9,11]]},"61":{"position":[[19,12]]},"84":{"position":[[10,11]]},"291":{"position":[[15,11]]},"302":{"position":[[13,11]]},"378":{"position":[[27,12]]},"380":{"position":[[24,11]]},"382":{"position":[[30,11]]},"425":{"position":[[22,12]]},"462":{"position":[[12,12]]},"464":{"position":[[12,12]]},"468":{"position":[[7,12]]},"571":{"position":[[7,11]]},"579":{"position":[[7,11]]},"601":{"position":[[21,11]]},"602":{"position":[[11,11]]},"606":{"position":[[10,11]]},"609":{"position":[[13,11]]},"611":{"position":[[14,11]]},"616":{"position":[[33,12]]},"625":{"position":[[10,12]]},"809":{"position":[[0,11]]},"842":{"position":[[11,11]]},"844":{"position":[[8,12]]},"846":{"position":[[10,12]]},"1027":{"position":[[4,11]]},"1029":{"position":[[15,11]]},"1031":{"position":[[15,11]]},"1093":{"position":[[10,12]]},"1103":{"position":[[11,12]]},"1136":{"position":[[0,11]]},"1138":{"position":[[9,11]]},"1142":{"position":[[7,11]]},"1174":{"position":[[13,12]]},"1214":{"position":[[7,10]]},"1222":{"position":[[25,12]]},"1256":{"position":[[7,10]]},"1307":{"position":[[22,10]]},"1315":{"position":[[22,10]]},"1410":{"position":[[6,10]]},"1416":{"position":[[14,10]]},"1424":{"position":[[27,12]]},"1427":{"position":[[14,11]]},"1497":{"position":[[0,10]]},"1570":{"position":[[5,10]]},"1620":{"position":[[11,12]]},"1622":{"position":[[10,12]]},"1648":{"position":[[5,11]]},"1650":{"position":[[5,10]]},"1658":{"position":[[11,10]]},"1686":{"position":[[13,11]]},"1706":{"position":[[14,11]]},"1718":{"position":[[11,10]]},"1720":{"position":[[12,11]]},"1722":{"position":[[12,11]]},"1724":{"position":[[13,11]]},"1726":{"position":[[13,11]]}}}],["associationintegrityassurancefilt",{"_index":466,"t":{"1264":{"position":[[0,35]]}}}],["astableex",{"_index":459,"t":{"1238":{"position":[[0,9]]}}}],["attribut",{"_index":405,"t":{"1011":{"position":[[12,10]]},"1027":{"position":[[16,10]]},"1481":{"position":[[0,9]]},"1482":{"position":[[4,10]]}}}],["authent",{"_index":231,"t":{"478":{"position":[[30,12]]}}}],["author",{"_index":38,"t":{"67":{"position":[[19,7]]},"73":{"position":[[19,7]]},"1414":{"position":[[17,7]]},"1420":{"position":[[17,7]]},"1681":{"position":[[0,6]]},"1724":{"position":[[30,7]]},"1726":{"position":[[25,6]]}}}],["auto",{"_index":291,"t":{"689":{"position":[[0,4]]},"1293":{"position":[[0,4]]}}}],["autoincr",{"_index":216,"t":{"451":{"position":[[9,13]]}}}],["automat",{"_index":243,"t":{"535":{"position":[[0,13]]},"537":{"position":[[0,13]]},"616":{"position":[[3,13]]},"1276":{"position":[[0,9]]},"1964":{"position":[[0,13]]}}}],["avgpric",{"_index":336,"t":{"799":{"position":[[30,8]]},"801":{"position":[[20,8]]},"803":{"position":[[23,8]]},"805":{"position":[[7,8]]},"807":{"position":[[6,8]]}}}],["backward",{"_index":270,"t":{"611":{"position":[[5,8]]}}}],["base",{"_index":5,"t":{"20":{"position":[[6,5]]},"297":{"position":[[15,5]]},"304":{"position":[[7,5]]},"408":{"position":[[3,5]]},"410":{"position":[[3,5]]},"418":{"position":[[3,5]]},"420":{"position":[[3,5]]},"762":{"position":[[13,5]]},"862":{"position":[[19,5]]},"1101":{"position":[[11,5]]},"1234":{"position":[[26,5]]},"1450":{"position":[[14,5]]},"1452":{"position":[[14,5]]},"1842":{"position":[[8,5]]}}}],["basic",{"_index":48,"t":{"91":{"position":[[0,5]]},"132":{"position":[[0,5]]},"240":{"position":[[0,5]]},"322":{"position":[[0,5]]},"352":{"position":[[0,5]]},"388":{"position":[[0,5]]},"425":{"position":[[0,5]]},"517":{"position":[[0,5]]},"523":{"position":[[0,5]]},"545":{"position":[[0,5]]},"586":{"position":[[0,5]]},"599":{"position":[[0,5]]},"614":{"position":[[0,5]]},"624":{"position":[[0,5]]},"777":{"position":[[0,5]]},"788":{"position":[[0,5]]},"837":{"position":[[0,5]]},"935":{"position":[[0,5]]},"1047":{"position":[[5,5]]},"1080":{"position":[[0,5]]},"1191":{"position":[[0,5]]},"1302":{"position":[[0,5]]},"1506":{"position":[[0,5]]},"1654":{"position":[[0,5]]}}}],["batch",{"_index":325,"t":{"774":{"position":[[0,5]]}}}],["batchsiz",{"_index":493,"t":{"1425":{"position":[[0,9]]}}}],["behavior",{"_index":28,"t":{"54":{"position":[[8,8]]},"619":{"position":[[21,8]]},"621":{"position":[[19,8]]},"1524":{"position":[[8,8]]}}}],["benefit",{"_index":345,"t":{"833":{"position":[[6,8]]}}}],["best",{"_index":289,"t":{"683":{"position":[[0,4]]},"693":{"position":[[0,4]]}}}],["better",{"_index":54,"t":{"98":{"position":[[0,6]]}}}],["between",{"_index":221,"t":{"462":{"position":[[25,7]]},"464":{"position":[[25,7]]},"1674":{"position":[[18,7]]}}}],["binlog",{"_index":10,"t":{"28":{"position":[[15,6]]},"882":{"position":[[0,6]]}}}],["book",{"_index":19,"t":{"43":{"position":[[5,4]]},"45":{"position":[[10,4]]},"65":{"position":[[23,5]]},"67":{"position":[[14,4]]},"71":{"position":[[23,5]]},"73":{"position":[[14,4]]},"427":{"position":[[0,4]]},"604":{"position":[[0,4]]},"1412":{"position":[[11,4]]},"1414":{"position":[[12,4]]},"1418":{"position":[[11,4]]},"1420":{"position":[[12,4]]},"1679":{"position":[[0,4]]},"1708":{"position":[[0,4]]},"1720":{"position":[[24,4]]},"1722":{"position":[[34,5]]},"1724":{"position":[[25,4]]},"1726":{"position":[[32,5]]}}}],["bookcontrol",{"_index":526,"t":{"1644":{"position":[[6,14]]}}}],["bookrepositori",{"_index":523,"t":{"1637":{"position":[[4,14]]},"1638":{"position":[[11,14]]},"1640":{"position":[[10,14]]},"1642":{"position":[[8,14]]}}}],["bookstor",{"_index":37,"t":{"65":{"position":[[13,9]]},"71":{"position":[[13,9]]},"799":{"position":[[20,9]]},"809":{"position":[[25,9]]},"1677":{"position":[[0,9]]},"1722":{"position":[[24,9]]}}}],["boolean",{"_index":428,"t":{"1097":{"position":[[18,7]]},"1107":{"position":[[22,7]]}}}],["boot",{"_index":30,"t":{"54":{"position":[[27,4]]},"127":{"position":[[11,4]]},"129":{"position":[[17,4]]},"317":{"position":[[11,4]]},"878":{"position":[[20,4]]},"880":{"position":[[24,4]]},"1598":{"position":[[16,4]]},"1952":{"position":[[13,4]]},"1954":{"position":[[17,4]]}}}],["both",{"_index":543,"t":{"1790":{"position":[[8,4]]}}}],["breadth",{"_index":350,"t":{"844":{"position":[[29,7]]}}}],["built",{"_index":416,"t":{"1040":{"position":[[5,5]]}}}],["bulk",{"_index":256,"t":{"575":{"position":[[0,4]]},"581":{"position":[[0,4]]}}}],["busi",{"_index":203,"t":{"404":{"position":[[3,8]]},"1156":{"position":[[5,8]]},"1518":{"position":[[10,8]]},"1938":{"position":[[10,8]]}}}],["cach",{"_index":2,"t":{"16":{"position":[[16,7]]},"18":{"position":[[13,5]]},"24":{"position":[[0,5]]},"36":{"position":[[18,5]]},"40":{"position":[[0,5]]},"59":{"position":[[21,5]]},"69":{"position":[[0,5]]},"90":{"position":[[0,5]]},"93":{"position":[[7,5]]},"95":{"position":[[18,5]]},"108":{"position":[[0,5]]},"113":{"position":[[12,5]]},"121":{"position":[[6,5]]},"1166":{"position":[[5,5]]},"1268":{"position":[[11,5]]},"1774":{"position":[[4,5]]},"1776":{"position":[[0,5]]}}}],["cacheabandonedcallback",{"_index":24,"t":{"50":{"position":[[0,22]]}}}],["cacheablefilt",{"_index":465,"t":{"1262":{"position":[[0,15]]}}}],["cachefactori",{"_index":60,"t":{"111":{"position":[[0,12]]},"115":{"position":[[12,12]]}}}],["calcul",{"_index":14,"t":{"34":{"position":[[0,10]]},"36":{"position":[[7,10]]},"86":{"position":[[18,10]]},"100":{"position":[[10,10]]},"297":{"position":[[21,11]]},"304":{"position":[[13,11]]},"799":{"position":[[7,11]]},"809":{"position":[[12,11]]}}}],["callback",{"_index":26,"t":{"52":{"position":[[12,8]]}}}],["case",{"_index":235,"t":{"485":{"position":[[6,4]]},"487":{"position":[[6,4]]},"1374":{"position":[[0,4]]},"1402":{"position":[[0,4]]},"1404":{"position":[[7,4]]},"1406":{"position":[[9,4]]}}}],["caus",{"_index":448,"t":{"1152":{"position":[[5,5]]},"1224":{"position":[[16,6]]}}}],["caveat",{"_index":314,"t":{"743":{"position":[[0,7]]}}}],["center",{"_index":562,"t":{"1932":{"position":[[9,6]]}}}],["chang",{"_index":332,"t":{"792":{"position":[[52,6]]},"1738":{"position":[[12,6]]},"1745":{"position":[[14,6]]}}}],["characterist",{"_index":353,"t":{"848":{"position":[[0,15]]}}}],["check",{"_index":257,"t":{"577":{"position":[[0,5]]},"629":{"position":[[0,8]]},"766":{"position":[[0,5]]},"768":{"position":[[0,5]]},"1378":{"position":[[5,5]]}}}],["child",{"_index":271,"t":{"616":{"position":[[50,5]]},"618":{"position":[[63,5]]},"667":{"position":[[13,5]]}}}],["childnod",{"_index":432,"t":{"1105":{"position":[[15,10]]},"1107":{"position":[[11,10]]}}}],["circular",{"_index":342,"t":{"829":{"position":[[7,8]]}}}],["clarifi",{"_index":338,"t":{"810":{"position":[[0,7]]}}}],["classic",{"_index":190,"t":{"378":{"position":[[15,7]]}}}],["classif",{"_index":264,"t":{"601":{"position":[[3,14]]},"608":{"position":[[3,14]]},"869":{"position":[[8,14]]}}}],["claus",{"_index":499,"t":{"1456":{"position":[[35,7]]}}}],["client",{"_index":82,"t":{"143":{"position":[[9,6]]},"145":{"position":[[12,6]]},"209":{"position":[[0,6]]},"286":{"position":[[21,6]]},"1186":{"position":[[0,6]]}}}],["coalesc",{"_index":487,"t":{"1398":{"position":[[0,8]]}}}],["code",{"_index":83,"t":{"143":{"position":[[16,4]]},"197":{"position":[[20,5]]},"210":{"position":[[21,4]]},"943":{"position":[[19,4]]},"1232":{"position":[[10,4]]},"1272":{"position":[[4,4]]},"1469":{"position":[[0,4]]},"1477":{"position":[[9,4]]},"1539":{"position":[[10,4]]},"1609":{"position":[[0,4]]},"1662":{"position":[[11,4]]},"1690":{"position":[[10,4]]},"1712":{"position":[[10,4]]},"1741":{"position":[[10,4]]},"1750":{"position":[[10,4]]}}}],["collect",{"_index":34,"t":{"61":{"position":[[8,10]]},"1103":{"position":[[0,10]]},"1222":{"position":[[14,10]]},"1224":{"position":[[0,10]]}}}],["column",{"_index":173,"t":{"324":{"position":[[9,6]]},"445":{"position":[[1,6]]},"1381":{"position":[[7,6]]},"1383":{"position":[[9,7]]},"1450":{"position":[[30,6]]},"1452":{"position":[[32,7]]},"1786":{"position":[[15,7]]}}}],["combin",{"_index":542,"t":{"1790":{"position":[[0,7]]}}}],["command",{"_index":281,"t":{"635":{"position":[[0,7]]},"708":{"position":[[5,7]]},"854":{"position":[[5,8]]},"1160":{"position":[[10,7]]}}}],["comment",{"_index":514,"t":{"1568":{"position":[[9,8]]},"1646":{"position":[[9,8]]}}}],["common",{"_index":401,"t":{"1001":{"position":[[4,6]]}}}],["comparison",{"_index":167,"t":{"306":{"position":[[0,10]]},"705":{"position":[[0,10]]},"1140":{"position":[[0,10]]},"1371":{"position":[[0,10]]},"1947":{"position":[[0,10]]}}}],["compil",{"_index":501,"t":{"1477":{"position":[[0,8]]}}}],["complet",{"_index":449,"t":{"1154":{"position":[[3,8]]},"1728":{"position":[[0,8]]}}}],["complex",{"_index":45,"t":{"86":{"position":[[10,7]]},"1416":{"position":[[6,7]]}}}],["comprehens",{"_index":504,"t":{"1495":{"position":[[0,13]]}}}],["concat",{"_index":488,"t":{"1400":{"position":[[0,6]]}}}],["concept",{"_index":42,"t":{"78":{"position":[[0,8]]},"91":{"position":[[6,8]]},"132":{"position":[[6,8]]},"171":{"position":[[0,7]]},"235":{"position":[[0,8]]},"240":{"position":[[6,8]]},"337":{"position":[[0,7]]},"357":{"position":[[0,8]]},"425":{"position":[[6,8]]},"517":{"position":[[6,8]]},"552":{"position":[[0,7]]},"586":{"position":[[6,8]]},"599":{"position":[[6,8]]},"614":{"position":[[6,8]]},"624":{"position":[[6,8]]},"627":{"position":[[0,7]]},"663":{"position":[[0,7]]},"788":{"position":[[6,8]]},"792":{"position":[[10,8]]},"837":{"position":[[6,8]]},"874":{"position":[[0,7]]},"935":{"position":[[6,8]]},"984":{"position":[[3,8]]},"1080":{"position":[[6,8]]},"1285":{"position":[[0,7]]},"1302":{"position":[[6,8]]},"1440":{"position":[[0,7]]},"1506":{"position":[[6,8]]},"1695":{"position":[[0,7]]}}}],["condit",{"_index":226,"t":{"470":{"position":[[0,11]]},"1201":{"position":[[12,9]]},"1203":{"position":[[13,9]]}}}],["configur",{"_index":64,"t":{"115":{"position":[[0,11]]},"117":{"position":[[11,13]]},"119":{"position":[[15,13]]},"314":{"position":[[13,13]]},"588":{"position":[[4,13]]},"618":{"position":[[3,11]]},"631":{"position":[[0,13]]},"633":{"position":[[7,13]]},"635":{"position":[[14,13]]},"741":{"position":[[13,14]]},"1250":{"position":[[0,9]]},"1252":{"position":[[0,9]]},"1424":{"position":[[8,14]]},"1602":{"position":[[11,13]]},"1604":{"position":[[13,14]]},"1760":{"position":[[17,14]]}}}],["conflict",{"_index":95,"t":{"156":{"position":[[14,9]]},"1582":{"position":[[6,11]]},"1589":{"position":[[6,11]]}}}],["connectionmanag",{"_index":102,"t":{"173":{"position":[[7,17]]},"175":{"position":[[0,17]]}}}],["conserv",{"_index":275,"t":{"619":{"position":[[0,12]]}}}],["consist",{"_index":9,"t":{"28":{"position":[[0,11]]},"30":{"position":[[0,11]]}}}],["constant",{"_index":483,"t":{"1367":{"position":[[0,8]]}}}],["control",{"_index":249,"t":{"558":{"position":[[0,11]]},"1551":{"position":[[0,7]]}}}],["controversi",{"_index":194,"t":{"384":{"position":[[4,13]]}}}],["convers",{"_index":255,"t":{"573":{"position":[[8,10]]}}}],["convert",{"_index":287,"t":{"677":{"position":[[10,9]]},"1820":{"position":[[3,7]]}}}],["creat",{"_index":356,"t":{"860":{"position":[[3,6]]},"862":{"position":[[3,6]]},"884":{"position":[[0,6]]},"991":{"position":[[3,6]]},"993":{"position":[[17,6]]},"1473":{"position":[[0,6]]},"1594":{"position":[[0,6]]},"1598":{"position":[[0,6]]}}}],["custom",{"_index":88,"t":{"147":{"position":[[15,6]]},"457":{"position":[[0,6]]},"501":{"position":[[0,6]]},"1037":{"position":[[4,6]]},"1038":{"position":[[21,6]]},"1298":{"position":[[6,6]]},"1970":{"position":[[27,6]]},"1972":{"position":[[26,6]]}}}],["data",{"_index":89,"t":{"147":{"position":[[22,4]]},"347":{"position":[[14,4]]},"375":{"position":[[14,4]]},"539":{"position":[[3,4]]},"554":{"position":[[19,4]]},"665":{"position":[[26,4]]},"667":{"position":[[25,4]]},"726":{"position":[[23,4]]},"752":{"position":[[9,4]]},"754":{"position":[[9,4]]},"758":{"position":[[12,4]]},"760":{"position":[[12,4]]},"766":{"position":[[6,4]]},"768":{"position":[[6,4]]},"860":{"position":[[10,4]]},"862":{"position":[[14,4],[37,4]]},"1188":{"position":[[16,4]]},"1358":{"position":[[8,4]]},"1513":{"position":[[22,4]]},"1515":{"position":[[22,4]]},"1545":{"position":[[10,4]]},"1849":{"position":[[25,4]]},"1958":{"position":[[9,4]]}}}],["databas",{"_index":215,"t":{"451":{"position":[[0,8]]},"453":{"position":[[0,8]]},"1762":{"position":[[31,8]]},"1928":{"position":[[0,9]]}}}],["debezium",{"_index":541,"t":{"1780":{"position":[[0,8]]}}}],["declar",{"_index":79,"t":{"141":{"position":[[0,7]]},"199":{"position":[[0,7]]},"432":{"position":[[0,9]]}}}],["deeper",{"_index":351,"t":{"846":{"position":[[3,6]]}}}],["default",{"_index":27,"t":{"54":{"position":[[0,7]]},"483":{"position":[[0,7]]},"619":{"position":[[13,7]]},"621":{"position":[[11,7]]},"1524":{"position":[[0,7]]},"1972":{"position":[[7,7]]}}}],["defin",{"_index":49,"t":{"93":{"position":[[0,6]]},"195":{"position":[[0,6]]},"244":{"position":[[0,6]]},"263":{"position":[[0,6]]},"468":{"position":[[0,6]]},"505":{"position":[[0,6]]},"554":{"position":[[0,6]]},"556":{"position":[[0,6]]},"675":{"position":[[0,6]]},"687":{"position":[[0,8]]},"801":{"position":[[0,6]]},"805":{"position":[[0,6]]},"812":{"position":[[0,6]]},"816":{"position":[[0,6]]},"858":{"position":[[3,6]]},"958":{"position":[[0,6]]},"960":{"position":[[0,6]]},"962":{"position":[[14,7]]},"964":{"position":[[23,6]]},"1087":{"position":[[0,6]]},"1201":{"position":[[0,6]]},"1248":{"position":[[0,6]]},"1291":{"position":[[0,8]]},"1360":{"position":[[0,6]]},"1475":{"position":[[0,6]]},"1537":{"position":[[0,6]]},"1578":{"position":[[0,6]]},"1585":{"position":[[0,6]]},"1633":{"position":[[0,6]]},"1710":{"position":[[0,6]]},"1718":{"position":[[0,6]]},"1739":{"position":[[0,6]]},"1962":{"position":[[0,6]]},"1970":{"position":[[0,6]]},"1972":{"position":[[0,6]]}}}],["definit",{"_index":278,"t":{"627":{"position":[[8,10]]},"645":{"position":[[7,10]]},"1676":{"position":[[12,11]]},"1728":{"position":[[18,10]]},"1762":{"position":[[16,11]]},"1930":{"position":[[7,10]]}}}],["delet",{"_index":41,"t":{"75":{"position":[[17,8]]},"519":{"position":[[8,6]]},"521":{"position":[[9,6]]},"579":{"position":[[0,6]]},"581":{"position":[[5,6]]},"1172":{"position":[[13,8]]},"1216":{"position":[[15,8]]},"1218":{"position":[[16,8]]},"1624":{"position":[[0,6]]}}}],["demo",{"_index":300,"t":{"716":{"position":[[0,4]]},"831":{"position":[[10,4]]},"1274":{"position":[[0,4]]},"1508":{"position":[[0,4]]},"1699":{"position":[[0,4]]}}}],["depend",{"_index":165,"t":{"298":{"position":[[0,9]]},"300":{"position":[[0,9]]},"302":{"position":[[0,9]]},"956":{"position":[[0,12]]},"1600":{"position":[[4,12]]},"1606":{"position":[[19,12]]}}}],["depth",{"_index":352,"t":{"846":{"position":[[31,5]]},"1549":{"position":[[8,5]]}}}],["descript",{"_index":147,"t":{"269":{"position":[[8,11]]}}}],["design",{"_index":160,"t":{"289":{"position":[[15,6]]},"1068":{"position":[[0,6]]}}}],["determin",{"_index":319,"t":{"758":{"position":[[0,11]]},"760":{"position":[[0,11]]},"762":{"position":[[19,13]]}}}],["develop",{"_index":84,"t":{"145":{"position":[[0,7]]},"882":{"position":[[15,11]]},"1193":{"position":[[15,10]]}}}],["dialect",{"_index":100,"t":{"166":{"position":[[4,7]]},"168":{"position":[[0,7]]},"1522":{"position":[[0,8]]}}}],["differ",{"_index":224,"t":{"464":{"position":[[33,9]]},"618":{"position":[[23,9]]},"774":{"position":[[24,9]]},"1337":{"position":[[0,11]]},"1701":{"position":[[10,10]]}}}],["dilemma",{"_index":435,"t":{"1114":{"position":[[0,7]]}}}],["directli",{"_index":305,"t":{"727":{"position":[[8,8]]},"1138":{"position":[[28,8]]},"1703":{"position":[[20,8]]},"1816":{"position":[[12,8]]}}}],["disabl",{"_index":464,"t":{"1258":{"position":[[0,7]]}}}],["disadvantag",{"_index":383,"t":{"954":{"position":[[0,13]]}}}],["discuss",{"_index":422,"t":{"1064":{"position":[[0,10]]}}}],["dissoci",{"_index":186,"t":{"359":{"position":[[0,12]]},"525":{"position":[[0,10]]},"527":{"position":[[0,12]]},"665":{"position":[[0,12]]},"667":{"position":[[0,12]]},"669":{"position":[[0,12]]}}}],["distribut",{"_index":124,"t":{"216":{"position":[[0,11]]}}}],["document",{"_index":421,"t":{"1062":{"position":[[11,13]]},"1564":{"position":[[9,13]]},"1568":{"position":[[0,8]]},"1646":{"position":[[0,8]]}}}],["don",{"_index":70,"t":{"129":{"position":[[0,3]]}}}],["doubl",{"_index":193,"t":{"382":{"position":[[11,6]]}}}],["draft",{"_index":374,"t":{"913":{"position":[[21,6]]},"1170":{"position":[[5,5]]}}}],["dsl",{"_index":436,"t":{"1116":{"position":[[21,3]]},"1162":{"position":[[9,3]]},"1272":{"position":[[0,3]]},"1573":{"position":[[11,3]]}}}],["dto",{"_index":143,"t":{"263":{"position":[[20,3]]},"537":{"position":[[25,3]]},"675":{"position":[[13,3]]},"687":{"position":[[9,3]]},"689":{"position":[[15,3]]},"729":{"position":[[22,3]]},"1291":{"position":[[9,3]]},"1293":{"position":[[15,3]]},"1295":{"position":[[9,3]]},"1537":{"position":[[21,3]]},"1629":{"position":[[0,3]]},"1631":{"position":[[0,3]]},"1633":{"position":[[7,3]]},"1635":{"position":[[15,4]]},"1688":{"position":[[6,3]]},"1710":{"position":[[13,3]]},"1739":{"position":[[13,3]]},"1748":{"position":[[6,3]]},"1758":{"position":[[0,3]]},"1798":{"position":[[13,3]]},"1803":{"position":[[13,3]]},"1812":{"position":[[13,3]]},"1829":{"position":[[13,3]]},"1835":{"position":[[13,3]]},"1854":{"position":[[13,3]]},"1859":{"position":[[13,3]]},"1872":{"position":[[13,3]]},"1914":{"position":[[13,3]]},"1962":{"position":[[7,3]]},"1964":{"position":[[23,3]]},"1966":{"position":[[6,3]]}}}],["duplic",{"_index":454,"t":{"1224":{"position":[[23,9]]},"1226":{"position":[[9,9]]}}}],["dynam",{"_index":183,"t":{"341":{"position":[[0,7]]},"361":{"position":[[0,7]]},"697":{"position":[[11,7]]},"737":{"position":[[3,7]]},"848":{"position":[[19,7]]},"1369":{"position":[[21,7]]},"1575":{"position":[[0,7]]},"1577":{"position":[[0,7]]},"1578":{"position":[[7,7]]},"1796":{"position":[[6,7]]},"1801":{"position":[[6,7]]},"1807":{"position":[[6,7]]},"1827":{"position":[[6,7]]},"1833":{"position":[[6,7]]},"1852":{"position":[[6,7]]},"1857":{"position":[[6,7]]},"1870":{"position":[[6,7]]},"1912":{"position":[[6,7]]},"1945":{"position":[[6,7]]},"1976":{"position":[[0,7]]},"1978":{"position":[[0,7]]},"1980":{"position":[[0,7]]},"1988":{"position":[[0,7]]},"1990":{"position":[[0,7]]},"1994":{"position":[[0,7]]}}}],["ecosystem",{"_index":451,"t":{"1176":{"position":[[3,9]]}}}],["effect",{"_index":123,"t":{"212":{"position":[[15,7]]},"276":{"position":[[8,6]]},"349":{"position":[[0,7]]},"1345":{"position":[[0,13]]},"1883":{"position":[[28,6]]},"1885":{"position":[[22,6]]},"1887":{"position":[[21,6]]},"1899":{"position":[[21,6]]},"1901":{"position":[[20,6]]},"1940":{"position":[[4,7]]}}}],["emb",{"_index":132,"t":{"230":{"position":[[0,5]]}}}],["embed",{"_index":166,"t":{"300":{"position":[[13,8]]}}}],["enabl",{"_index":0,"t":{"16":{"position":[[0,8]]},"36":{"position":[[0,6]]},"59":{"position":[[0,8]]},"95":{"position":[[0,6]]},"154":{"position":[[0,6]]},"183":{"position":[[0,6]]},"185":{"position":[[0,6]]},"224":{"position":[[0,6]]},"722":{"position":[[0,8]]},"1560":{"position":[[0,6]]},"1936":{"position":[[0,6]]}}}],["entangl",{"_index":378,"t":{"924":{"position":[[0,9]]},"926":{"position":[[20,9]]}}}],["entiti",{"_index":187,"t":{"365":{"position":[[1,6]]},"441":{"position":[[1,6]]},"462":{"position":[[38,6]]},"464":{"position":[[43,6]]},"645":{"position":[[0,6]]},"697":{"position":[[19,8]]},"714":{"position":[[7,6]]},"727":{"position":[[24,6]]},"962":{"position":[[7,6]]},"964":{"position":[[7,6]]},"1140":{"position":[[16,6]]},"1144":{"position":[[39,6]]},"1212":{"position":[[12,6]]},"1352":{"position":[[19,6]]},"1360":{"position":[[7,8]]},"1672":{"position":[[10,8]]},"1674":{"position":[[26,8]]},"1676":{"position":[[0,6]]},"1762":{"position":[[9,6]]},"1796":{"position":[[14,8]]},"1801":{"position":[[14,8]]},"1807":{"position":[[14,8]]},"1827":{"position":[[14,8]]},"1833":{"position":[[14,8]]},"1852":{"position":[[14,8]]},"1857":{"position":[[14,8]]},"1870":{"position":[[14,8]]},"1912":{"position":[[14,8]]},"1930":{"position":[[0,6]]}}}],["entitygraph",{"_index":478,"t":{"1337":{"position":[[21,11]]}}}],["enum",{"_index":411,"t":{"1025":{"position":[[3,4]]}}}],["enumtyp",{"_index":156,"t":{"284":{"position":[[23,8]]}}}],["environ",{"_index":360,"t":{"884":{"position":[[16,11]]}}}],["equal",{"_index":106,"t":{"185":{"position":[[11,8]]}}}],["error",{"_index":111,"t":{"197":{"position":[[14,5]]}}}],["essenc",{"_index":200,"t":{"392":{"position":[[4,7]]},"434":{"position":[[0,7]]}}}],["essenti",{"_index":529,"t":{"1701":{"position":[[0,9]]}}}],["exampl",{"_index":161,"t":{"289":{"position":[[22,7]]},"527":{"position":[[13,8]]},"639":{"position":[[4,7]]},"641":{"position":[[7,7]]},"671":{"position":[[0,7]]},"888":{"position":[[6,8]]},"1060":{"position":[[14,8]]},"1280":{"position":[[0,7]]},"1282":{"position":[[0,7]]},"1287":{"position":[[0,8]]},"1352":{"position":[[11,7]]},"1442":{"position":[[0,7]]},"1495":{"position":[[14,7]]},"1772":{"position":[[0,7]]}}}],["except",{"_index":107,"t":{"193":{"position":[[0,9]]},"195":{"position":[[7,9]]},"199":{"position":[[8,10]]},"200":{"position":[[19,10]]},"202":{"position":[[20,10]]},"204":{"position":[[19,10]]},"205":{"position":[[6,10]]},"207":{"position":[[6,9]]}}}],["execut",{"_index":55,"t":{"104":{"position":[[0,7]]},"106":{"position":[[0,7]]}}}],["exist",{"_index":258,"t":{"577":{"position":[[6,9]]},"758":{"position":[[17,9]]},"760":{"position":[[17,9]]},"766":{"position":[[11,9]]},"768":{"position":[[11,9]]},"862":{"position":[[28,8]]},"1150":{"position":[[0,8]]},"1462":{"position":[[4,6]]}}}],["experi",{"_index":364,"t":{"892":{"position":[[0,10]]}}}],["explicitli",{"_index":155,"t":{"284":{"position":[[7,10]]},"474":{"position":[[0,10]]},"476":{"position":[[0,10]]},"478":{"position":[[7,10]]}}}],["export",{"_index":115,"t":{"204":{"position":[[0,6]]},"995":{"position":[[4,6]]}}}],["expos",{"_index":530,"t":{"1703":{"position":[[13,6]]}}}],["express",{"_index":469,"t":{"1280":{"position":[[19,10]]},"1365":{"position":[[8,11]]},"1367":{"position":[[9,11]]},"1450":{"position":[[3,10]]},"1452":{"position":[[3,10]]}}}],["extens",{"_index":537,"t":{"1764":{"position":[[8,9]]},"1766":{"position":[[6,9]]}}}],["extern",{"_index":359,"t":{"884":{"position":[[7,8]]}}}],["face",{"_index":306,"t":{"729":{"position":[[7,5]]}}}],["fake",{"_index":230,"t":{"476":{"position":[[19,4]]}}}],["famili",{"_index":108,"t":{"193":{"position":[[10,8]]},"195":{"position":[[17,8]]},"200":{"position":[[33,6]]},"202":{"position":[[34,6]]}}}],["fast",{"_index":394,"t":{"981":{"position":[[7,4]]}}}],["featur",{"_index":146,"t":{"269":{"position":[[0,7]]},"1070":{"position":[[4,8]]},"1511":{"position":[[0,8]]}}}],["fetch",{"_index":212,"t":{"436":{"position":[[0,8]]},"807":{"position":[[0,5]]},"818":{"position":[[0,5]]},"1324":{"position":[[0,8]]},"1326":{"position":[[0,8]]},"1328":{"position":[[0,8]]},"1354":{"position":[[0,5]]},"1362":{"position":[[0,5]]},"1410":{"position":[[0,5]]},"1416":{"position":[[0,5]]},"1422":{"position":[[0,8]]}}}],["fetchbi",{"_index":80,"t":{"141":{"position":[[9,7]]}}}],["fetcher",{"_index":7,"t":{"22":{"position":[[13,8]]},"852":{"position":[[7,8]]},"926":{"position":[[7,8]]},"1158":{"position":[[5,7]]},"1333":{"position":[[21,8]]},"1335":{"position":[[13,8]]},"1530":{"position":[[17,7]]},"1984":{"position":[[7,8]]},"1998":{"position":[[7,7]]}}}],["few",{"_index":346,"t":{"838":{"position":[[5,3]]}}}],["field",{"_index":110,"t":{"197":{"position":[[4,6]]},"321":{"position":[[12,5]]},"404":{"position":[[12,6]]},"1037":{"position":[[11,6]]},"1038":{"position":[[28,6]]},"1324":{"position":[[16,6]]},"1326":{"position":[[18,6]]},"1328":{"position":[[20,6]]},"1422":{"position":[[19,6]]},"1718":{"position":[[22,6]]}}}],["file",{"_index":398,"t":{"991":{"position":[[10,4]]},"993":{"position":[[24,5]]},"1473":{"position":[[7,4]]},"1594":{"position":[[11,4]]},"1633":{"position":[[11,5]]}}}],["filter",{"_index":47,"t":{"90":{"position":[[15,7]]},"93":{"position":[[22,7]]},"1168":{"position":[[12,6]]},"1212":{"position":[[0,6]]},"1214":{"position":[[0,6]]},"1216":{"position":[[24,6]]},"1218":{"position":[[25,6]]},"1248":{"position":[[7,6]]},"1250":{"position":[[10,6]]},"1252":{"position":[[10,6]]},"1254":{"position":[[0,6]]},"1256":{"position":[[0,6]]},"1258":{"position":[[8,7]]},"1260":{"position":[[5,6]]},"1266":{"position":[[9,7]]},"1307":{"position":[[12,6]]},"1315":{"position":[[12,6]]},"1429":{"position":[[15,7]]},"1918":{"position":[[13,7]]},"1920":{"position":[[0,6]]}}}],["final",{"_index":251,"t":{"565":{"position":[[0,5]]}}}],["findbyid",{"_index":472,"t":{"1296":{"position":[[6,8]]}}}],["fix",{"_index":310,"t":{"733":{"position":[[3,5]]}}}],["flat",{"_index":414,"t":{"1035":{"position":[[6,4]]},"1570":{"position":[[0,4]]},"1648":{"position":[[0,4]]},"1650":{"position":[[0,4]]}}}],["forbid",{"_index":341,"t":{"829":{"position":[[0,6]]}}}],["foreign",{"_index":176,"t":{"326":{"position":[[11,7]]},"408":{"position":[[12,7]]},"418":{"position":[[12,7]]},"474":{"position":[[24,7]]},"476":{"position":[[24,7]]},"478":{"position":[[46,7]]},"627":{"position":[[27,7]]}}}],["form",{"_index":208,"t":{"427":{"position":[[5,4]]},"604":{"position":[[5,4]]},"1708":{"position":[[5,4]]}}}],["format",{"_index":247,"t":{"554":{"position":[[24,6]]},"558":{"position":[[16,6]]},"774":{"position":[[34,7]]}}}],["forward",{"_index":269,"t":{"609":{"position":[[5,7]]},"1444":{"position":[[0,7]]}}}],["friendli",{"_index":46,"t":{"90":{"position":[[6,8]]},"93":{"position":[[13,8]]}}}],["fromstr",{"_index":372,"t":{"911":{"position":[[0,10]]}}}],["full",{"_index":329,"t":{"792":{"position":[[20,4]]}}}],["function",{"_index":90,"t":{"152":{"position":[[0,8]]},"1001":{"position":[[11,15]]},"1003":{"position":[[19,15]]},"1005":{"position":[[27,15]]},"1033":{"position":[[9,8]]},"1035":{"position":[[11,8]]},"1142":{"position":[[47,8]]},"1144":{"position":[[20,13]]},"1154":{"position":[[12,13]]},"1282":{"position":[[20,9]]},"1396":{"position":[[10,9]]},"1488":{"position":[[4,9]]},"1489":{"position":[[20,9]]},"1491":{"position":[[5,8]]},"1493":{"position":[[8,9]]}}}],["fuzzi",{"_index":312,"t":{"739":{"position":[[3,5]]},"1373":{"position":[[0,5]]}}}],["gener",{"_index":81,"t":{"143":{"position":[[0,8]]},"210":{"position":[[0,9]]},"689":{"position":[[5,9]]},"1042":{"position":[[5,7]]},"1089":{"position":[[0,8]]},"1232":{"position":[[0,9]]},"1272":{"position":[[9,9]]},"1293":{"position":[[5,9]]},"1539":{"position":[[0,9]]},"1566":{"position":[[0,8]]},"1609":{"position":[[5,10]]},"1611":{"position":[[18,10]]},"1635":{"position":[[5,9]]},"1690":{"position":[[0,9]]},"1712":{"position":[[0,9]]},"1741":{"position":[[0,9]]},"1750":{"position":[[0,9]]},"1762":{"position":[[0,8]]},"1964":{"position":[[14,8]]}}}],["generatedvalu",{"_index":214,"t":{"449":{"position":[[1,14]]}}}],["get",{"_index":196,"t":{"386":{"position":[[0,7]]},"1060":{"position":[[27,7]]},"1116":{"position":[[0,7]]}}}],["getter",{"_index":427,"t":{"1095":{"position":[[9,6]]},"1097":{"position":[[4,6]]},"1105":{"position":[[8,6]]},"1107":{"position":[[4,6]]}}}],["global",{"_index":135,"t":{"242":{"position":[[0,6]]},"310":{"position":[[0,6]]},"633":{"position":[[0,6]]},"1168":{"position":[[5,6]]}}}],["graphql",{"_index":74,"t":{"134":{"position":[[12,7]]},"261":{"position":[[16,7]]},"265":{"position":[[10,7]]},"271":{"position":[[10,7]]}}}],["graphqlinput",{"_index":296,"t":{"705":{"position":[[16,12]]}}}],["group",{"_index":461,"t":{"1243":{"position":[[0,8]]}}}],["half",{"_index":476,"t":{"1313":{"position":[[0,4]]}}}],["handl",{"_index":308,"t":{"731":{"position":[[10,6]]},"1188":{"position":[[0,8]]}}}],["handler",{"_index":363,"t":{"890":{"position":[[9,7]]}}}],["harm",{"_index":455,"t":{"1226":{"position":[[0,5]]}}}],["helper",{"_index":69,"t":{"121":{"position":[[12,6]]}}}],["heterogen",{"_index":532,"t":{"1745":{"position":[[0,13]]}}}],["hidden",{"_index":442,"t":{"1136":{"position":[[19,6]]}}}],["hide",{"_index":377,"t":{"920":{"position":[[0,4]]}}}],["higher",{"_index":313,"t":{"741":{"position":[[0,6]]}}}],["highlight",{"_index":534,"t":{"1758":{"position":[[20,12]]}}}],["homogen",{"_index":531,"t":{"1738":{"position":[[0,11]]}}}],["http",{"_index":120,"t":{"207":{"position":[[28,4]]},"679":{"position":[[0,4]]},"691":{"position":[[0,4]]},"1692":{"position":[[6,4]]},"1714":{"position":[[6,4]]},"1743":{"position":[[6,4]]},"1752":{"position":[[6,4]]}}}],["id",{"_index":6,"t":{"20":{"position":[[15,2]]},"43":{"position":[[16,2]]},"212":{"position":[[11,3]]},"447":{"position":[[1,2]]},"531":{"position":[[13,2]]},"649":{"position":[[3,2]]},"653":{"position":[[3,2]]},"752":{"position":[[17,2]]},"758":{"position":[[30,2]]},"766":{"position":[[24,2]]},"1033":{"position":[[6,2]]},"1307":{"position":[[33,3]]},"1315":{"position":[[33,3]]},"1410":{"position":[[35,2]]},"1570":{"position":[[16,3]]},"1648":{"position":[[17,2]]}}}],["idempot",{"_index":323,"t":{"770":{"position":[[7,10]]}}}],["ident",{"_index":57,"t":{"104":{"position":[[24,8]]},"106":{"position":[[40,10]]}}}],["idgener",{"_index":219,"t":{"457":{"position":[[7,11]]}}}],["idview",{"_index":211,"t":{"431":{"position":[[0,6]]},"436":{"position":[[9,6]]},"535":{"position":[[25,6]]},"962":{"position":[[23,6]]},"964":{"position":[[31,6]]},"1350":{"position":[[0,6]]},"1354":{"position":[[7,6]]},"1808":{"position":[[15,6]]},"1810":{"position":[[12,6]]}}}],["ignor",{"_index":97,"t":{"158":{"position":[[12,6]]},"1216":{"position":[[0,6]]},"1580":{"position":[[0,6]]},"1587":{"position":[[0,6]]}}}],["ii",{"_index":546,"t":{"1822":{"position":[[0,2]]}}}],["immut",{"_index":355,"t":{"858":{"position":[[10,9]]},"896":{"position":[[13,9]]}}}],["implement",{"_index":144,"t":{"265":{"position":[[0,9]]},"271":{"position":[[0,9]]},"272":{"position":[[12,14]]},"803":{"position":[[0,9]]},"814":{"position":[[0,9]]},"968":{"position":[[10,9]]},"977":{"position":[[0,14]]},"1055":{"position":[[4,12]]},"1518":{"position":[[0,9]]},"1934":{"position":[[0,12]]},"1938":{"position":[[0,9]]}}}],["implicit",{"_index":456,"t":{"1228":{"position":[[0,8]]},"1584":{"position":[[0,8]]},"1585":{"position":[[7,8]]}}}],["import",{"_index":328,"t":{"792":{"position":[[0,9]]},"1044":{"position":[[5,6]]}}}],["improv",{"_index":288,"t":{"681":{"position":[[0,11]]},"762":{"position":[[0,8]]},"1666":{"position":[[0,8]]}}}],["inapplic",{"_index":475,"t":{"1309":{"position":[[0,12]]},"1317":{"position":[[0,12]]}}}],["includ",{"_index":348,"t":{"842":{"position":[[3,7]]},"1658":{"position":[[3,7]]}}}],["incorrect",{"_index":344,"t":{"831":{"position":[[0,9]]}}}],["increment",{"_index":331,"t":{"792":{"position":[[40,11]]}}}],["index",{"_index":227,"t":{"470":{"position":[[12,7]]}}}],["inherit",{"_index":185,"t":{"354":{"position":[[9,11]]},"1105":{"position":[[0,7]]},"1968":{"position":[[4,9]]}}}],["inlin",{"_index":130,"t":{"228":{"position":[[0,6]]}}}],["inner",{"_index":438,"t":{"1120":{"position":[[0,5]]}}}],["input",{"_index":141,"t":{"261":{"position":[[24,5]]},"263":{"position":[[14,5]]},"542":{"position":[[8,5]]},"675":{"position":[[7,5]]},"726":{"position":[[28,5]]},"729":{"position":[[16,5]]},"968":{"position":[[20,5]]},"999":{"position":[[9,5]]},"1001":{"position":[[39,5]]},"1003":{"position":[[4,5]]},"1710":{"position":[[7,5]]},"1739":{"position":[[7,5]]}}}],["inputnotnul",{"_index":240,"t":{"512":{"position":[[0,12]]}}}],["insert",{"_index":253,"t":{"571":{"position":[[0,6]]},"575":{"position":[[5,6]]},"748":{"position":[[3,6]]},"764":{"position":[[3,6]]}}}],["insert_if_abs",{"_index":320,"t":{"764":{"position":[[3,16]]}}}],["insert_onli",{"_index":315,"t":{"748":{"position":[[3,11]]}}}],["integ",{"_index":154,"t":{"282":{"position":[[7,7]]}}}],["integr",{"_index":87,"t":{"147":{"position":[[0,9]]},"945":{"position":[[0,11]]},"1950":{"position":[[0,9]]}}}],["interact",{"_index":354,"t":{"850":{"position":[[0,11]]}}}],["intercept",{"_index":246,"t":{"554":{"position":[[7,11]]}}}],["interceptor",{"_index":248,"t":{"556":{"position":[[7,11]]},"560":{"position":[[6,11]]},"1170":{"position":[[11,11]]}}}],["interfac",{"_index":61,"t":{"111":{"position":[[13,9]]},"481":{"position":[[16,9]]},"968":{"position":[[26,9]]},"1055":{"position":[[17,10]]},"1260":{"position":[[12,10]]},"1352":{"position":[[26,9]]},"1730":{"position":[[4,10]]}}}],["intern",{"_index":506,"t":{"1520":{"position":[[0,8]]}}}],["introduc",{"_index":477,"t":{"1333":{"position":[[4,9]]}}}],["introduct",{"_index":91,"t":{"152":{"position":[[9,12]]},"261":{"position":[[0,12]]},"786":{"position":[[0,12]]},"948":{"position":[[0,12]]},"1038":{"position":[[5,12]]},"1489":{"position":[[0,12]]},"1772":{"position":[[8,12]]}}}],["invalid",{"_index":8,"t":{"24":{"position":[[6,12]]},"40":{"position":[[6,12]]},"69":{"position":[[6,12]]},"108":{"position":[[6,12]]},"1897":{"position":[[19,7]]}}}],["invers",{"_index":202,"t":{"402":{"position":[[0,7]]},"422":{"position":[[0,7]]}}}],["isidonli",{"_index":367,"t":{"901":{"position":[[0,8]]}}}],["isload",{"_index":366,"t":{"897":{"position":[[0,8]]}}}],["islon",{"_index":369,"t":{"905":{"position":[[0,8]]}}}],["isnul",{"_index":553,"t":{"1875":{"position":[[0,6]]},"1889":{"position":[[0,6]]}}}],["issu",{"_index":294,"t":{"699":{"position":[[9,5]]},"726":{"position":[[13,6]]},"729":{"position":[[0,6]]}}}],["jackson",{"_index":158,"t":{"286":{"position":[[32,7]]}}}],["java",{"_index":163,"t":{"297":{"position":[[3,4]]},"508":{"position":[[0,4]]},"943":{"position":[[14,4]]},"1053":{"position":[[12,4]]},"1193":{"position":[[10,4]]},"1627":{"position":[[0,4]]}}}],["jdbctemplat",{"_index":565,"t":{"1956":{"position":[[10,12]]}}}],["jimmer",{"_index":142,"t":{"263":{"position":[[7,6]]},"561":{"position":[[6,6]]},"563":{"position":[[10,6]]},"641":{"position":[[0,6]]},"878":{"position":[[6,6]]},"880":{"position":[[10,6]]},"1147":{"position":[[11,6]]},"1272":{"position":[[22,6]]},"1511":{"position":[[12,6]]},"1516":{"position":[[0,6]]},"1573":{"position":[[0,6]]},"1847":{"position":[[18,6]]},"1936":{"position":[[31,6]]}}}],["join",{"_index":206,"t":{"404":{"position":[[43,4]]},"410":{"position":[[12,4]]},"420":{"position":[[12,4]]},"547":{"position":[[6,4]]},"779":{"position":[[6,4]]},"1082":{"position":[[6,5]]},"1118":{"position":[[21,5]]},"1120":{"position":[[6,4]]},"1122":{"position":[[5,4]]},"1201":{"position":[[7,4]]},"1203":{"position":[[8,4]]},"1224":{"position":[[11,4]]},"1306":{"position":[[8,5]]},"1313":{"position":[[5,5]]},"1577":{"position":[[14,5]]},"1578":{"position":[[21,5]]},"1580":{"position":[[21,5]]},"1582":{"position":[[24,5]]},"1883":{"position":[[10,5]]},"1885":{"position":[[11,5]]},"1887":{"position":[[10,5]]},"1978":{"position":[[8,4]]},"1990":{"position":[[8,4]]}}}],["joincolumn",{"_index":179,"t":{"330":{"position":[[15,10]]}}}],["jointabl",{"_index":180,"t":{"332":{"position":[[15,9]]}}}],["jpa",{"_index":282,"t":{"639":{"position":[[0,3]]},"1337":{"position":[[17,3]]}}}],["json",{"_index":168,"t":{"310":{"position":[[7,4]]},"312":{"position":[[15,4]]},"499":{"position":[[0,4]]}}}],["judgment",{"_index":555,"t":{"1877":{"position":[[0,8]]}}}],["key",{"_index":177,"t":{"326":{"position":[[19,4]]},"328":{"position":[[11,3]]},"408":{"position":[[20,3]]},"418":{"position":[[20,3]]},"474":{"position":[[32,3]]},"476":{"position":[[32,3]]},"478":{"position":[[54,4]]},"627":{"position":[[35,3]]},"651":{"position":[[3,3]]},"655":{"position":[[3,3]]},"754":{"position":[[17,3]]},"760":{"position":[[30,3]]},"762":{"position":[[9,3]]},"768":{"position":[[24,3]]},"1070":{"position":[[0,3]]}}}],["kotlin",{"_index":164,"t":{"297":{"position":[[8,6]]},"506":{"position":[[0,6]]},"1053":{"position":[[21,6]]},"1602":{"position":[[36,6]]},"1627":{"position":[[5,6]]}}}],["lambda",{"_index":430,"t":{"1101":{"position":[[4,6]]}}}],["languag",{"_index":521,"t":{"1629":{"position":[[4,8]]},"1631":{"position":[[4,8]]},"1758":{"position":[[4,8]]}}}],["larger",{"_index":349,"t":{"844":{"position":[[22,6]]},"846":{"position":[[24,6]]}}}],["left",{"_index":439,"t":{"1122":{"position":[[0,4]]}}}],["level",{"_index":62,"t":{"113":{"position":[[6,5]]},"248":{"position":[[9,5]]},"312":{"position":[[9,5]]},"315":{"position":[[8,5]]},"635":{"position":[[8,5]]},"741":{"position":[[7,5]]},"1234":{"position":[[4,5]]},"1427":{"position":[[26,5]]},"1429":{"position":[[9,5]]}}}],["limit",{"_index":189,"t":{"378":{"position":[[0,11]]},"1549":{"position":[[0,7]]}}}],["link",{"_index":420,"t":{"1057":{"position":[[12,5]]}}}],["list",{"_index":101,"t":{"168":{"position":[[8,4]]},"1380":{"position":[[3,4]]}}}],["listen",{"_index":361,"t":{"886":{"position":[[0,6]]}}}],["liter",{"_index":482,"t":{"1365":{"position":[[0,7]]}}}],["local",{"_index":126,"t":{"218":{"position":[[0,5]]}}}],["lock",{"_index":299,"t":{"712":{"position":[[11,4]]},"718":{"position":[[12,4]]},"720":{"position":[[20,4]]},"722":{"position":[[21,4]]}}}],["log",{"_index":128,"t":{"224":{"position":[[11,3]]}}}],["logic",{"_index":40,"t":{"75":{"position":[[9,7]]},"519":{"position":[[0,7]]},"890":{"position":[[17,5]]},"1172":{"position":[[5,7]]},"1216":{"position":[[7,7]]},"1218":{"position":[[8,7]]},"1499":{"position":[[0,7]]},"1518":{"position":[[19,5]]},"1922":{"position":[[0,5]]},"1938":{"position":[[25,5]]}}}],["lombok",{"_index":381,"t":{"945":{"position":[[17,6]]}}}],["long",{"_index":266,"t":{"606":{"position":[[5,4]]},"1622":{"position":[[5,4]]},"1686":{"position":[[8,4]]}}}],["low",{"_index":170,"t":{"315":{"position":[[4,3]]}}}],["lower",{"_index":237,"t":{"487":{"position":[[0,5]]}}}],["lower_cas",{"_index":236,"t":{"487":{"position":[[0,10]]}}}],["make",{"_index":387,"t":{"968":{"position":[[0,4]]}}}],["makeidonli",{"_index":368,"t":{"903":{"position":[[0,10]]}}}],["manag",{"_index":103,"t":{"175":{"position":[[18,7]]}}}],["mani",{"_index":36,"t":{"65":{"position":[[7,4]]},"67":{"position":[[0,4],[8,4]]},"71":{"position":[[7,4]]},"73":{"position":[[0,4],[8,4]]},"380":{"position":[[11,4],[19,4]]},"382":{"position":[[18,4]]},"466":{"position":[[14,4],[23,4],[31,4]]},"1720":{"position":[[7,4]]},"1722":{"position":[[7,4]]},"1724":{"position":[[0,4],[8,4]]},"1726":{"position":[[0,4],[8,4]]}}}],["manytomani",{"_index":491,"t":{"1414":{"position":[[0,10]]},"1420":{"position":[[0,10]]}}}],["manytomanyview",{"_index":198,"t":{"386":{"position":[[21,14]]},"390":{"position":[[7,14]]},"392":{"position":[[16,14]]},"1356":{"position":[[0,14]]},"1362":{"position":[[7,14]]}}}],["manytoon",{"_index":490,"t":{"1412":{"position":[[0,9]]},"1418":{"position":[[0,9]]}}}],["map",{"_index":152,"t":{"280":{"position":[[0,3]]},"282":{"position":[[0,3]]},"310":{"position":[[12,7]]},"312":{"position":[[20,7]]},"388":{"position":[[19,7]]},"1025":{"position":[[8,7]]},"1209":{"position":[[0,7]]},"1246":{"position":[[17,6]]},"1481":{"position":[[10,7]]},"1482":{"position":[[0,3]]}}}],["mappedsuperclass",{"_index":188,"t":{"367":{"position":[[1,16]]}}}],["mapper",{"_index":386,"t":{"960":{"position":[[7,6]]}}}],["mapstruct",{"_index":286,"t":{"677":{"position":[[0,9]]}}}],["mask",{"_index":245,"t":{"539":{"position":[[8,7]]}}}],["match",{"_index":470,"t":{"1280":{"position":[[30,8]]},"1373":{"position":[[6,8]]},"1376":{"position":[[0,5]]}}}],["math",{"_index":486,"t":{"1394":{"position":[[0,4]]}}}],["maxwel",{"_index":540,"t":{"1778":{"position":[[0,7]]}}}],["mechan",{"_index":280,"t":{"629":{"position":[[9,9]]},"1520":{"position":[[9,9]]}}}],["merg",{"_index":261,"t":{"592":{"position":[[3,5]]},"1127":{"position":[[0,5]]},"1276":{"position":[[10,5]]},"1582":{"position":[[0,5]]},"1589":{"position":[[0,5]]}}}],["messag",{"_index":119,"t":{"207":{"position":[[16,8]]},"886":{"position":[[10,7]]}}}],["method",{"_index":259,"t":{"588":{"position":[[18,7]]},"772":{"position":[[13,7]]},"1968":{"position":[[14,7]]},"1970":{"position":[[16,7]]},"1972":{"position":[[15,7]]}}}],["microservic",{"_index":563,"t":{"1936":{"position":[[7,12]]}}}],["microsoft",{"_index":209,"t":{"429":{"position":[[0,9]]}}}],["middl",{"_index":184,"t":{"349":{"position":[[11,6]]},"665":{"position":[[13,6]]}}}],["mix",{"_index":225,"t":{"466":{"position":[[0,6]]},"1053":{"position":[[5,6]]}}}],["mode",{"_index":125,"t":{"216":{"position":[[24,4]]},"218":{"position":[[18,4]]},"359":{"position":[[13,5]]},"525":{"position":[[11,4]]},"669":{"position":[[13,5]]},"746":{"position":[[5,5]]},"1376":{"position":[[6,5]]},"1774":{"position":[[10,4]]},"1776":{"position":[[6,4]]}}}],["model",{"_index":443,"t":{"1136":{"position":[[36,5]]},"1156":{"position":[[14,5]]},"1545":{"position":[[0,5]]}}}],["modifi",{"_index":22,"t":{"43":{"position":[[22,8]]},"45":{"position":[[0,9]]},"714":{"position":[[0,6]]},"1042":{"position":[[23,9]]},"1352":{"position":[[0,6]]}}}],["more",{"_index":347,"t":{"840":{"position":[[3,4]]},"844":{"position":[[3,4]]},"1260":{"position":[[0,4]]}}}],["motiv",{"_index":340,"t":{"828":{"position":[[0,10]]}}}],["multi",{"_index":50,"t":{"95":{"position":[[7,5]]},"113":{"position":[[0,5]]},"339":{"position":[[0,5]]},"347":{"position":[[0,5]]},"375":{"position":[[0,5]]},"1195":{"position":[[0,5]]},"1268":{"position":[[0,5]]}}}],["multipl",{"_index":59,"t":{"106":{"position":[[24,8]]},"354":{"position":[[0,8]]},"462":{"position":[[3,8]]},"464":{"position":[[3,8]]},"1023":{"position":[[14,8]]},"1326":{"position":[[9,8]]},"1383":{"position":[[0,8]]},"1452":{"position":[[23,8]]},"1553":{"position":[[13,8]]},"1786":{"position":[[6,8]]},"1838":{"position":[[0,8]]},"1840":{"position":[[13,8]]},"1918":{"position":[[4,8]]},"1920":{"position":[[12,8]]},"1958":{"position":[[0,8]]}}}],["mutabl",{"_index":373,"t":{"913":{"position":[[13,7]]}}}],["mutat",{"_index":145,"t":{"265":{"position":[[18,8]]}}}],["mysql",{"_index":326,"t":{"781":{"position":[[0,5]]},"1778":{"position":[[10,5]]}}}],["mysqldialect",{"_index":507,"t":{"1526":{"position":[[0,12]]}}}],["name",{"_index":174,"t":{"324":{"position":[[16,5]]},"481":{"position":[[0,6]]},"483":{"position":[[8,6]]}}}],["nativ",{"_index":552,"t":{"1864":{"position":[[0,6]]}}}],["need",{"_index":204,"t":{"404":{"position":[[19,4]]},"1602":{"position":[[25,6]]}}}],["neg",{"_index":404,"t":{"1011":{"position":[[3,8]]},"1330":{"position":[[0,8]]}}}],["new",{"_index":358,"t":{"862":{"position":[[10,3]]},"1637":{"position":[[0,3]]},"1640":{"position":[[6,3]]},"1642":{"position":[[4,3]]}}}],["newestbook",{"_index":337,"t":{"809":{"position":[[35,11]]},"812":{"position":[[20,11]]},"814":{"position":[[23,11]]},"816":{"position":[[7,11]]},"818":{"position":[[6,11]]}}}],["node",{"_index":511,"t":{"1551":{"position":[[22,4]]}}}],["non",{"_index":139,"t":{"250":{"position":[[0,3]]},"289":{"position":[[0,3]]},"291":{"position":[[0,3]]},"770":{"position":[[3,3]]},"1435":{"position":[[0,3]]},"1718":{"position":[[7,3]]},"1774":{"position":[[0,3]]}}}],["non_idempotent_upsert",{"_index":322,"t":{"770":{"position":[[3,21]]}}}],["note",{"_index":39,"t":{"75":{"position":[[0,5]]},"237":{"position":[[0,5]]},"583":{"position":[[0,5]]},"941":{"position":[[0,5]]},"950":{"position":[[0,5]]},"997":{"position":[[5,5]]},"1072":{"position":[[0,5]]},"1178":{"position":[[3,5]]},"1193":{"position":[[0,5]]},"1703":{"position":[[0,4]]},"1782":{"position":[[0,5]]}}}],["null",{"_index":302,"t":{"726":{"position":[[0,4]]},"1116":{"position":[[27,4]]},"1118":{"position":[[0,4]]},"1378":{"position":[[0,4]]}}}],["nullabl",{"_index":309,"t":{"731":{"position":[[17,8]]},"1013":{"position":[[3,11]]},"1484":{"position":[[0,11]]}}}],["nulliti",{"_index":239,"t":{"505":{"position":[[7,7]]}}}],["object",{"_index":1,"t":{"16":{"position":[[9,6]]},"18":{"position":[[6,6]]},"22":{"position":[[6,6]]},"300":{"position":[[22,6]]},"601":{"position":[[33,6]]},"616":{"position":[[56,7]]},"618":{"position":[[40,7],[69,7]]},"647":{"position":[[8,7]]},"649":{"position":[[16,7]]},"651":{"position":[[17,7]]},"653":{"position":[[11,7]]},"655":{"position":[[12,7]]},"727":{"position":[[31,7]]},"774":{"position":[[13,7]]},"848":{"position":[[27,7]]},"852":{"position":[[0,6]]},"896":{"position":[[23,7]]},"926":{"position":[[0,6]]},"1136":{"position":[[29,6]]},"1214":{"position":[[18,7]]},"1254":{"position":[[22,7]]},"1256":{"position":[[18,7]]},"1295":{"position":[[13,7]]},"1333":{"position":[[14,6]]},"1335":{"position":[[6,6]]},"1410":{"position":[[17,7]]},"1416":{"position":[[25,7]]},"1497":{"position":[[11,7]]},"1516":{"position":[[14,6]]},"1530":{"position":[[10,6]]},"1650":{"position":[[16,7]]},"1656":{"position":[[17,7]]},"1658":{"position":[[22,7]]},"1788":{"position":[[34,6]]},"1820":{"position":[[26,6]]},"1822":{"position":[[20,6]]},"1845":{"position":[[18,7]]},"1984":{"position":[[0,6]]},"1998":{"position":[[0,6]]}}}],["objectmapp",{"_index":169,"t":{"314":{"position":[[0,12]]}}}],["old",{"_index":524,"t":{"1638":{"position":[[7,3]]}}}],["on",{"_index":35,"t":{"65":{"position":[[0,3]]},"71":{"position":[[0,3]]},"104":{"position":[[13,3]]},"382":{"position":[[26,3]]},"466":{"position":[[7,3]]},"1720":{"position":[[0,3]]},"1722":{"position":[[0,3]]}}}],["oper",{"_index":365,"t":{"896":{"position":[[0,9]]},"913":{"position":[[0,9]]},"973":{"position":[[0,10]]},"975":{"position":[[0,9]]},"1195":{"position":[[12,10]]},"1394":{"position":[[5,10]]},"1458":{"position":[[8,8]]},"1460":{"position":[[8,8]]},"1462":{"position":[[11,8]]}}}],["optim",{"_index":105,"t":{"183":{"position":[[15,12]]},"185":{"position":[[20,12]]},"274":{"position":[[3,8]]},"1385":{"position":[[0,12]]},"1433":{"position":[[0,12]]}}}],["optimist",{"_index":298,"t":{"712":{"position":[[0,10]]}}}],["optimiz",{"_index":495,"t":{"1435":{"position":[[4,11]]},"1437":{"position":[[0,11]]}}}],["option",{"_index":503,"t":{"1491":{"position":[[14,7]]}}}],["oracledialect",{"_index":508,"t":{"1528":{"position":[[0,13]]}}}],["order",{"_index":268,"t":{"608":{"position":[[26,5]]},"1181":{"position":[[7,8]]},"1186":{"position":[[17,8]]},"1980":{"position":[[8,5]]},"1994":{"position":[[8,5]]}}}],["orderbi",{"_index":498,"t":{"1456":{"position":[[27,7]]},"1838":{"position":[[9,7]]},"1840":{"position":[[0,7]]}}}],["orderbyif",{"_index":452,"t":{"1184":{"position":[[0,9]]}}}],["ordinari",{"_index":171,"t":{"321":{"position":[[3,8]]},"1029":{"position":[[6,8]]}}}],["origin",{"_index":250,"t":{"558":{"position":[[30,8]]}}}],["orm",{"_index":191,"t":{"378":{"position":[[23,3]]},"850":{"position":[[17,3]]},"1149":{"position":[[3,3]]},"1701":{"position":[[32,3]]}}}],["outer",{"_index":424,"t":{"1082":{"position":[[0,5]]}}}],["overrid",{"_index":172,"t":{"324":{"position":[[0,8]]},"341":{"position":[[8,9]]},"361":{"position":[[8,9]]},"489":{"position":[[0,8]]},"621":{"position":[[0,10]]},"1095":{"position":[[0,8]]}}}],["overview",{"_index":252,"t":{"569":{"position":[[0,8]]},"1736":{"position":[[0,8]]}}}],["own",{"_index":201,"t":{"400":{"position":[[0,6]]},"416":{"position":[[0,6]]}}}],["pad",{"_index":104,"t":{"183":{"position":[[7,7]]}}}],["page",{"_index":505,"t":{"1516":{"position":[[9,4]]},"1845":{"position":[[13,4]]},"1847":{"position":[[10,4]]},"1849":{"position":[[10,4]]},"1982":{"position":[[0,5]]}}}],["pagin",{"_index":494,"t":{"1427":{"position":[[0,10]]},"1511":{"position":[[19,10]]},"1996":{"position":[[0,10]]}}}],["pain",{"_index":395,"t":{"985":{"position":[[5,4]]},"1150":{"position":[[9,4]]}}}],["paramet",{"_index":131,"t":{"228":{"position":[[11,10]]},"558":{"position":[[39,9]]},"697":{"position":[[28,10]]},"1042":{"position":[[13,9]]},"1051":{"position":[[11,9]]}}}],["parent",{"_index":273,"t":{"618":{"position":[[33,6]]},"1095":{"position":[[16,6]]},"1097":{"position":[[11,6]]}}}],["part",{"_index":446,"t":{"1149":{"position":[[7,4]]}}}],["partial",{"_index":98,"t":{"158":{"position":[[19,7]]},"1656":{"position":[[9,7]]}}}],["per",{"_index":389,"t":{"973":{"position":[[11,3]]},"1551":{"position":[[18,3]]}}}],["perform",{"_index":150,"t":{"274":{"position":[[12,11]]}}}],["pessimist",{"_index":301,"t":{"718":{"position":[[0,11]]},"720":{"position":[[8,11]]},"722":{"position":[[9,11]]}}}],["phantom",{"_index":474,"t":{"1306":{"position":[[0,7]]}}}],["philosophi",{"_index":423,"t":{"1068":{"position":[[7,10]]}}}],["physic",{"_index":241,"t":{"521":{"position":[[0,8]]}}}],["plugin",{"_index":522,"t":{"1631":{"position":[[13,6]]},"1758":{"position":[[33,6]]}}}],["point",{"_index":396,"t":{"985":{"position":[[10,5]]},"1150":{"position":[[14,6]]}}}],["pojo",{"_index":385,"t":{"958":{"position":[[7,4]]},"968":{"position":[[5,4]]}}}],["postgr",{"_index":327,"t":{"783":{"position":[[0,8]]},"1780":{"position":[[11,8]]}}}],["practic",{"_index":290,"t":{"683":{"position":[[5,9]]},"693":{"position":[[5,9]]}}}],["precaut",{"_index":162,"t":{"293":{"position":[[0,11]]},"510":{"position":[[0,11]]}}}],["predic",{"_index":484,"t":{"1369":{"position":[[7,10],[29,10]]},"1575":{"position":[[8,10]]},"1945":{"position":[[14,9]]}}}],["prepar",{"_index":481,"t":{"1358":{"position":[[0,7]]},"1545":{"position":[[15,11]]}}}],["preprocessor",{"_index":384,"t":{"956":{"position":[[17,13]]},"1086":{"position":[[4,12]]}}}],["prerequisit",{"_index":539,"t":{"1770":{"position":[[0,13]]}}}],["pretti",{"_index":129,"t":{"226":{"position":[[0,6]]}}}],["price",{"_index":23,"t":{"45":{"position":[[15,5]]}}}],["primari",{"_index":175,"t":{"326":{"position":[[3,7]]},"328":{"position":[[3,7]]}}}],["principl",{"_index":392,"t":{"977":{"position":[[15,10]]}}}],["problem",{"_index":292,"t":{"697":{"position":[[0,7]]},"1198":{"position":[[4,7]]},"1222":{"position":[[0,8]]}}}],["project",{"_index":86,"t":{"145":{"position":[[19,7]]},"1598":{"position":[[21,7]]},"1760":{"position":[[9,7]]}}}],["properti",{"_index":15,"t":{"34":{"position":[[11,8]]},"84":{"position":[[22,10]]},"86":{"position":[[29,10]]},"100":{"position":[[21,10]]},"248":{"position":[[0,8]]},"298":{"position":[[20,10]]},"302":{"position":[[25,10]]},"312":{"position":[[0,8]]},"431":{"position":[[7,8]]},"432":{"position":[[15,10]]},"434":{"position":[[16,10]]},"436":{"position":[[16,10]]},"505":{"position":[[18,10]]},"535":{"position":[[32,10]]},"731":{"position":[[26,10]]},"838":{"position":[[9,10]]},"840":{"position":[[8,10]]},"924":{"position":[[10,10]]},"926":{"position":[[30,10]]},"928":{"position":[[0,8]]},"962":{"position":[[30,10]]},"964":{"position":[[38,10]]},"1007":{"position":[[10,10]]},"1021":{"position":[[23,8]]},"1023":{"position":[[23,10]]},"1091":{"position":[[7,10]]},"1330":{"position":[[9,10]]},"1354":{"position":[[14,10]]},"1362":{"position":[[22,10]]},"1429":{"position":[[0,8]]},"1553":{"position":[[22,10]]},"1788":{"position":[[8,10]]},"1808":{"position":[[22,8]]},"1810":{"position":[[19,8]]}}}],["provid",{"_index":138,"t":{"246":{"position":[[16,8]]},"1246":{"position":[[0,7]]}}}],["q",{"_index":333,"t":{"794":{"position":[[0,1]]},"876":{"position":[[0,1]]}}}],["qbe",{"_index":502,"t":{"1488":{"position":[[0,3]]},"1489":{"position":[[16,3]]},"1493":{"position":[[4,3]]}}}],["quarku",{"_index":536,"t":{"1764":{"position":[[0,7]]}}}],["queri",{"_index":4,"t":{"20":{"position":[[0,5]]},"1138":{"position":[[0,8]]},"1140":{"position":[[29,7]]},"1234":{"position":[[10,7]]},"1295":{"position":[[0,8]]},"1298":{"position":[[13,7]]},"1617":{"position":[[0,5]]},"1627":{"position":[[29,5]]},"1656":{"position":[[3,5]]},"1660":{"position":[[13,5]]},"1786":{"position":[[0,5]]},"1788":{"position":[[26,7]]},"1796":{"position":[[0,5]]},"1798":{"position":[[0,5]]},"1801":{"position":[[0,5]]},"1803":{"position":[[0,5]]},"1807":{"position":[[0,5]]},"1812":{"position":[[0,5]]},"1827":{"position":[[0,5]]},"1829":{"position":[[0,5]]},"1833":{"position":[[0,5]]},"1835":{"position":[[0,5]]},"1852":{"position":[[0,5]]},"1854":{"position":[[0,5]]},"1857":{"position":[[0,5]]},"1859":{"position":[[0,5]]},"1870":{"position":[[0,5]]},"1872":{"position":[[0,5]]},"1912":{"position":[[0,5]]},"1914":{"position":[[0,5]]},"1938":{"position":[[19,5]]},"1966":{"position":[[0,5]]},"1982":{"position":[[6,7]]}}}],["queue",{"_index":362,"t":{"886":{"position":[[18,5]]}}}],["real",{"_index":229,"t":{"474":{"position":[[19,4]]}}}],["recap",{"_index":16,"t":{"34":{"position":[[20,5]]}}}],["recommend",{"_index":12,"t":{"28":{"position":[[31,11]]},"136":{"position":[[16,11]]},"871":{"position":[[0,11]]}}}],["recurs",{"_index":413,"t":{"1031":{"position":[[5,9]]},"1547":{"position":[[10,9]]},"1551":{"position":[[8,9]]},"1553":{"position":[[0,9]]},"1660":{"position":[[3,9]]}}}],["redi",{"_index":68,"t":{"121":{"position":[[0,5]]}}}],["refer",{"_index":343,"t":{"829":{"position":[[16,10]]},"1093":{"position":[[0,9]]}}}],["referenc",{"_index":178,"t":{"330":{"position":[[0,10]]},"332":{"position":[[0,10]]}}}],["regist",{"_index":25,"t":{"52":{"position":[[0,11]]},"246":{"position":[[0,8]]},"890":{"position":[[0,8]]}}}],["registr",{"_index":140,"t":{"250":{"position":[[11,12]]},"252":{"position":[[7,12]]}}}],["registri",{"_index":561,"t":{"1932":{"position":[[0,8]]}}}],["regular",{"_index":468,"t":{"1280":{"position":[[11,7]]}}}],["relat",{"_index":303,"t":{"726":{"position":[[5,7]]},"1057":{"position":[[4,7]]}}}],["relationship",{"_index":199,"t":{"388":{"position":[[6,12]]},"1674":{"position":[[4,13]]}}}],["remot",{"_index":450,"t":{"1174":{"position":[[6,6]]}}}],["renam",{"_index":408,"t":{"1019":{"position":[[3,8]]},"1021":{"position":[[5,8]]},"1023":{"position":[[5,8]]}}}],["repeatedli",{"_index":58,"t":{"106":{"position":[[8,10]]}}}],["replac",{"_index":262,"t":{"594":{"position":[[3,7]]},"792":{"position":[[25,11]]},"1049":{"position":[[16,11]]}}}],["report",{"_index":388,"t":{"972":{"position":[[0,6]]}}}],["repositori",{"_index":527,"t":{"1662":{"position":[[0,10]]},"1664":{"position":[[13,10]]},"1666":{"position":[[9,10]]},"1968":{"position":[[27,10]]},"1970":{"position":[[34,10]]},"1972":{"position":[[33,10]]}}}],["requir",{"_index":339,"t":{"810":{"position":[[8,12]]},"1606":{"position":[[10,8]]},"1746":{"position":[[0,12]]}}}],["resolv",{"_index":93,"t":{"156":{"position":[[0,7]]},"801":{"position":[[7,8]]},"803":{"position":[[10,8]]},"812":{"position":[[7,8]]},"814":{"position":[[10,8]]}}}],["respond",{"_index":18,"t":{"41":{"position":[[0,10]]}}}],["respons",{"_index":121,"t":{"207":{"position":[[33,9]]}}}],["rest",{"_index":112,"t":{"199":{"position":[[23,4]]}}}],["restcontrol",{"_index":513,"t":{"1562":{"position":[[6,14]]}}}],["restrict",{"_index":277,"t":{"621":{"position":[[36,12]]}}}],["result",{"_index":297,"t":{"708":{"position":[[13,6]]},"1224":{"position":[[33,7]]},"1226":{"position":[[19,7]]},"1627":{"position":[[35,7]]}}}],["revers",{"_index":254,"t":{"573":{"position":[[0,7]]},"616":{"position":[[25,7]]},"1218":{"position":[[0,7]]},"1446":{"position":[[0,7]]}}}],["review",{"_index":304,"t":{"727":{"position":[[0,6]]},"1638":{"position":[[0,6]]}}}],["root",{"_index":447,"t":{"1152":{"position":[[0,4]]},"1212":{"position":[[7,4]]},"1254":{"position":[[17,4]]}}}],["rule",{"_index":440,"t":{"1127":{"position":[[6,5]]},"1433":{"position":[[13,5]]}}}],["run",{"_index":151,"t":{"276":{"position":[[0,7]]},"1940":{"position":[[0,3]]}}}],["s",{"_index":210,"t":{"429":{"position":[[10,1]]},"1116":{"position":[[25,1]]},"1516":{"position":[[7,1]]}}}],["safeti",{"_index":437,"t":{"1116":{"position":[[32,6]]},"1118":{"position":[[5,6]]}}}],["same",{"_index":222,"t":{"462":{"position":[[33,4]]},"1144":{"position":[[15,4]]}}}],["save",{"_index":267,"t":{"608":{"position":[[21,4]]},"708":{"position":[[0,4]]},"727":{"position":[[17,6]]},"746":{"position":[[0,4]]},"772":{"position":[[8,4]]},"774":{"position":[[6,6]]},"854":{"position":[[0,4]]},"1160":{"position":[[5,4]]},"1619":{"position":[[0,4]]},"1620":{"position":[[0,4]]},"1622":{"position":[[0,4]]}}}],["scalar",{"_index":137,"t":{"246":{"position":[[9,6]]},"799":{"position":[[0,6]]},"1091":{"position":[[0,6]]},"1324":{"position":[[9,6]]},"1328":{"position":[[13,6]]}}}],["scalarprovid",{"_index":136,"t":{"242":{"position":[[7,14]]},"244":{"position":[[7,14]]},"248":{"position":[[15,14]]}}}],["scenario",{"_index":43,"t":{"80":{"position":[[0,9]]},"384":{"position":[[27,8]]},"460":{"position":[[4,9]]},"989":{"position":[[17,9]]},"1309":{"position":[[13,9]]},"1311":{"position":[[11,9]]},"1317":{"position":[[13,9]]},"1319":{"position":[[11,9]]},"1435":{"position":[[16,8]]},"1437":{"position":[[12,8]]},"1697":{"position":[[0,9]]},"1738":{"position":[[19,8]]},"1745":{"position":[[21,8]]}}}],["scene",{"_index":441,"t":{"1131":{"position":[[0,5]]},"1133":{"position":[[0,5]]}}}],["scratch",{"_index":357,"t":{"860":{"position":[[30,7]]}}}],["search",{"_index":489,"t":{"1406":{"position":[[0,8]]}}}],["second",{"_index":390,"t":{"973":{"position":[[15,6]]}}}],["secur",{"_index":293,"t":{"699":{"position":[[0,8]]}}}],["select",{"_index":497,"t":{"1456":{"position":[[16,6]]},"1467":{"position":[[0,6]]}}}],["sensit",{"_index":485,"t":{"1374":{"position":[[5,11]]}}}],["sequenc",{"_index":217,"t":{"453":{"position":[[9,8]]}}}],["server",{"_index":116,"t":{"204":{"position":[[7,6]]}}}],["servic",{"_index":148,"t":{"271":{"position":[[18,7]]},"1692":{"position":[[11,7]]},"1714":{"position":[[11,7]]},"1743":{"position":[[11,7]]},"1752":{"position":[[11,7]]},"1934":{"position":[[13,8]]}}}],["set",{"_index":99,"t":{"166":{"position":[[0,3]]},"616":{"position":[[17,7]]},"873":{"position":[[0,7]]},"914":{"position":[[0,3]]},"1343":{"position":[[0,3]]},"1347":{"position":[[0,3]]}}}],["setchildnod",{"_index":433,"t":{"1109":{"position":[[4,13]]}}}],["setpar",{"_index":429,"t":{"1099":{"position":[[4,9]]}}}],["shape",{"_index":265,"t":{"601":{"position":[[40,5]]},"687":{"position":[[13,5]]},"1291":{"position":[[13,6]]},"1962":{"position":[[11,5]]}}}],["shard",{"_index":467,"t":{"1266":{"position":[[0,8]]}}}],["short",{"_index":207,"t":{"425":{"position":[[16,5]]},"602":{"position":[[5,5]]},"625":{"position":[[4,5]]},"1620":{"position":[[5,5]]},"1706":{"position":[[8,5]]}}}],["show",{"_index":376,"t":{"918":{"position":[[0,4]]}}}],["side",{"_index":117,"t":{"204":{"position":[[14,4]]},"400":{"position":[[7,4]]},"402":{"position":[[8,4]]},"416":{"position":[[7,4]]},"422":{"position":[[8,4]]}}}],["simpl",{"_index":52,"t":{"96":{"position":[[0,6]]},"173":{"position":[[0,6]]},"298":{"position":[[13,6]]},"1007":{"position":[[3,6]]},"1404":{"position":[[0,6]]},"1454":{"position":[[18,6]]}}}],["simpler",{"_index":509,"t":{"1535":{"position":[[10,7]]}}}],["simplest",{"_index":149,"t":{"272":{"position":[[3,8]]},"1664":{"position":[[4,8]]}}}],["simplifi",{"_index":535,"t":{"1760":{"position":[[0,8]]}}}],["singl",{"_index":409,"t":{"1021":{"position":[[16,6]]},"1381":{"position":[[0,6]]},"1450":{"position":[[23,6]]}}}],["situat",{"_index":556,"t":{"1882":{"position":[[8,10]]},"1896":{"position":[[8,10]]}}}],["snatch",{"_index":274,"t":{"618":{"position":[[52,6]]}}}],["snowflak",{"_index":242,"t":{"531":{"position":[[3,9]]}}}],["solon",{"_index":538,"t":{"1766":{"position":[[0,5]]}}}],["solut",{"_index":72,"t":{"134":{"position":[[0,8]]},"136":{"position":[[0,8]]},"138":{"position":[[0,8]]},"429":{"position":[[12,8]]},"703":{"position":[[0,9]]},"987":{"position":[[5,8]]},"1304":{"position":[[8,8]]}}}],["solv",{"_index":453,"t":{"1198":{"position":[[15,5]]}}}],["sort",{"_index":33,"t":{"61":{"position":[[0,7]]},"1188":{"position":[[21,4]]},"1444":{"position":[[8,7]]},"1446":{"position":[[8,7]]},"1818":{"position":[[20,4]]},"1820":{"position":[[21,4]]},"1822":{"position":[[4,4],[15,4]]},"1842":{"position":[[0,7]]}}}],["sourc",{"_index":566,"t":{"1958":{"position":[[14,7]]}}}],["special",{"_index":492,"t":{"1424":{"position":[[0,7]]}}}],["specif",{"_index":400,"t":{"999":{"position":[[19,13]]},"1003":{"position":[[10,8]]},"1005":{"position":[[4,13],[18,8]]},"1475":{"position":[[7,13]]},"1537":{"position":[[7,13]]}}}],["specifi",{"_index":228,"t":{"474":{"position":[[11,7]]},"476":{"position":[[11,7]]},"478":{"position":[[18,7]]},"649":{"position":[[6,9]]},"651":{"position":[[7,9]]},"1186":{"position":[[7,9]]},"1788":{"position":[[0,7]]}}}],["spring",{"_index":29,"t":{"54":{"position":[[20,6]]},"127":{"position":[[4,6]]},"129":{"position":[[10,6]]},"175":{"position":[[29,6]]},"250":{"position":[[4,6]]},"252":{"position":[[0,6]]},"317":{"position":[[4,6]]},"561":{"position":[[13,6]]},"563":{"position":[[17,6]]},"878":{"position":[[13,6]]},"880":{"position":[[17,6]]},"1188":{"position":[[9,6]]},"1250":{"position":[[20,6]]},"1252":{"position":[[25,6]]},"1513":{"position":[[15,6]]},"1515":{"position":[[15,6]]},"1598":{"position":[[9,6]]},"1818":{"position":[[13,6]]},"1849":{"position":[[18,6]]},"1950":{"position":[[10,6]]},"1952":{"position":[[6,6]]},"1954":{"position":[[10,6]]}}}],["springboot",{"_index":65,"t":{"117":{"position":[[0,10]]},"491":{"position":[[11,10]]},"493":{"position":[[15,10]]}}}],["sql",{"_index":127,"t":{"224":{"position":[[7,3]]},"226":{"position":[[7,3]]},"228":{"position":[[7,3]]},"304":{"position":[[3,3]]},"1162":{"position":[[5,3]]},"1573":{"position":[[7,3]]},"1594":{"position":[[7,3]]},"1864":{"position":[[7,3]]}}}],["sqlclient",{"_index":520,"t":{"1615":{"position":[[0,9]]}}}],["stack",{"_index":133,"t":{"230":{"position":[[6,5]]}}}],["start",{"_index":197,"t":{"386":{"position":[[8,7]]},"1060":{"position":[[35,7]]},"1116":{"position":[[8,7]]}}}],["starter",{"_index":31,"t":{"54":{"position":[[32,7]]},"127":{"position":[[16,7]]},"129":{"position":[[22,7]]},"317":{"position":[[16,7]]},"561":{"position":[[20,7]]},"563":{"position":[[24,7]]},"878":{"position":[[25,7]]},"880":{"position":[[29,7]]},"1952":{"position":[[18,7]]},"1954":{"position":[[22,7]]}}}],["statement",{"_index":399,"t":{"995":{"position":[[11,9]]},"1044":{"position":[[12,10]]}}}],["static",{"_index":311,"t":{"735":{"position":[[3,6]]},"1181":{"position":[[0,6]]},"1369":{"position":[[0,6]]},"1798":{"position":[[6,6]]},"1803":{"position":[[6,6]]},"1812":{"position":[[6,6]]},"1829":{"position":[[6,6]]},"1835":{"position":[[6,6]]},"1854":{"position":[[6,6]]},"1859":{"position":[[6,6]]},"1872":{"position":[[6,6]]},"1914":{"position":[[6,6]]}}}],["statu",{"_index":528,"t":{"1672":{"position":[[0,6]]}}}],["store",{"_index":21,"t":{"43":{"position":[[10,5]]},"1412":{"position":[[16,5]]},"1418":{"position":[[16,5]]},"1720":{"position":[[29,5]]}}}],["store_id",{"_index":20,"t":{"43":{"position":[[10,8]]}}}],["strategi",{"_index":232,"t":{"481":{"position":[[7,8]]},"483":{"position":[[15,8]]},"489":{"position":[[9,8]]}}}],["string",{"_index":153,"t":{"280":{"position":[[7,6]]},"1816":{"position":[[4,7]]},"1820":{"position":[[11,6]]}}}],["structur",{"_index":159,"t":{"289":{"position":[[4,10]]},"291":{"position":[[4,10]]},"860":{"position":[[15,9]]},"1469":{"position":[[5,9]]}}}],["style",{"_index":380,"t":{"943":{"position":[[4,6]]},"1467":{"position":[[13,5]]},"1662":{"position":[[16,5]]}}}],["subkey",{"_index":44,"t":{"82":{"position":[[0,6]]},"84":{"position":[[0,6]]},"86":{"position":[[0,6]]},"100":{"position":[[0,6]]}}}],["subqueri",{"_index":444,"t":{"1142":{"position":[[25,8]]},"1144":{"position":[[52,8]]},"1228":{"position":[[9,10]]},"1236":{"position":[[20,10]]},"1449":{"position":[[6,10]]},"1454":{"position":[[6,8]]},"1456":{"position":[[4,8]]},"1464":{"position":[[8,10]]},"1584":{"position":[[9,10]]},"1585":{"position":[[16,10]]},"1587":{"position":[[15,10]]},"1589":{"position":[[18,10]]},"1842":{"position":[[17,10]]},"1897":{"position":[[4,10]]},"1899":{"position":[[5,10]]},"1901":{"position":[[4,10]]},"1992":{"position":[[0,10]]}}}],["success",{"_index":519,"t":{"1611":{"position":[[7,10]]}}}],["suggest",{"_index":560,"t":{"1924":{"position":[[0,10]]}}}],["summari",{"_index":263,"t":{"596":{"position":[[0,7]]}}}],["superclass",{"_index":463,"t":{"1246":{"position":[[24,10]]}}}],["support",{"_index":182,"t":{"339":{"position":[[14,7]]},"542":{"position":[[0,7]]},"1936":{"position":[[20,7]]}}}],["syntax",{"_index":418,"t":{"1053":{"position":[[28,6]]},"1758":{"position":[[13,6]]}}}],["t",{"_index":71,"t":{"129":{"position":[[4,1]]}}}],["tabl",{"_index":94,"t":{"156":{"position":[[8,5]]},"349":{"position":[[18,6]]},"404":{"position":[[48,5]]},"410":{"position":[[17,5]]},"420":{"position":[[17,5]]},"443":{"position":[[1,5]]},"665":{"position":[[20,5]]},"667":{"position":[[19,5]]},"1118":{"position":[[15,5]]},"1136":{"position":[[12,6]]},"1138":{"position":[[21,6]]},"1140":{"position":[[23,5]]},"1142":{"position":[[19,5]]},"1144":{"position":[[46,5]]},"1195":{"position":[[6,5]]},"1230":{"position":[[0,5]]},"1234":{"position":[[35,5]]},"1422":{"position":[[13,5]]},"1577":{"position":[[8,5]]},"1578":{"position":[[15,5]]},"1580":{"position":[[15,5]]},"1582":{"position":[[18,5]]},"1883":{"position":[[4,5]]},"1885":{"position":[[5,5]]},"1887":{"position":[[4,5]]}}}],["tableex",{"_index":457,"t":{"1230":{"position":[[10,7]]},"1236":{"position":[[0,7]]}}}],["take",{"_index":557,"t":{"1883":{"position":[[23,4]]},"1885":{"position":[[17,4]]},"1887":{"position":[[16,4]]},"1899":{"position":[[16,4]]},"1901":{"position":[[15,4]]}}}],["tangl",{"_index":195,"t":{"384":{"position":[[19,7]]}}}],["target",{"_index":279,"t":{"627":{"position":[[20,6]]}}}],["temporarili",{"_index":96,"t":{"158":{"position":[[0,11]]}}}],["tenant",{"_index":56,"t":{"104":{"position":[[17,6]]},"106":{"position":[[33,6]]}}}],["threshold",{"_index":479,"t":{"1343":{"position":[[4,9]]}}}],["throw",{"_index":114,"t":{"200":{"position":[[9,5]]},"202":{"position":[[9,5]]},"205":{"position":[[0,5]]}}}],["time",{"_index":391,"t":{"975":{"position":[[10,4]]}}}],["todo",{"_index":533,"t":{"1755":{"position":[[0,4]]}}}],["toidonli",{"_index":371,"t":{"909":{"position":[[0,8]]}}}],["tolon",{"_index":370,"t":{"907":{"position":[[0,8]]}}}],["top",{"_index":458,"t":{"1234":{"position":[[0,3]]}}}],["topic",{"_index":77,"t":{"138":{"position":[[12,5]]}}}],["trace",{"_index":134,"t":{"230":{"position":[[12,5]]}}}],["transact",{"_index":13,"t":{"30":{"position":[[15,11]]},"175":{"position":[[36,11]]},"216":{"position":[[12,11]]},"218":{"position":[[6,11]]},"1950":{"position":[[17,11]]}}}],["transfer",{"_index":544,"t":{"1818":{"position":[[0,8]]}}}],["transient",{"_index":334,"t":{"797":{"position":[[1,9]]}}}],["treat",{"_index":496,"t":{"1454":{"position":[[0,5]]}}}],["treenod",{"_index":425,"t":{"1087":{"position":[[7,8]]},"1728":{"position":[[9,8]]}}}],["treenodedraft",{"_index":426,"t":{"1089":{"position":[[9,13]]}}}],["tri",{"_index":525,"t":{"1642":{"position":[[0,3]]}}}],["trigger",{"_index":11,"t":{"28":{"position":[[22,7]]},"30":{"position":[[27,7]]},"41":{"position":[[14,8]]},"868":{"position":[[0,7]]},"869":{"position":[[0,7]]},"873":{"position":[[8,7]]},"882":{"position":[[7,7]]},"892":{"position":[[11,8]]},"1164":{"position":[[4,7]]}}}],["two",{"_index":220,"t":{"460":{"position":[[0,3]]},"588":{"position":[[0,3]]},"943":{"position":[[0,3]]},"993":{"position":[[5,3]]},"1307":{"position":[[0,3]]},"1315":{"position":[[0,3]]},"1845":{"position":[[0,3]]}}}],["type",{"_index":223,"t":{"462":{"position":[[45,5]]},"464":{"position":[[50,5]]},"497":{"position":[[6,5]]},"499":{"position":[[5,5]]},"501":{"position":[[7,5]]},"689":{"position":[[19,5]]},"714":{"position":[[14,5]]},"858":{"position":[[20,4]]},"868":{"position":[[8,5]]},"873":{"position":[[16,4]]},"1040":{"position":[[14,5]]},"1293":{"position":[[19,5]]},"1449":{"position":[[0,5]]},"1475":{"position":[[21,4]]},"1676":{"position":[[7,4]]},"1845":{"position":[[4,5]]},"1964":{"position":[[27,5]]},"1966":{"position":[[10,5]]}}}],["typescript",{"_index":122,"t":{"210":{"position":[[10,10]]},"212":{"position":[[0,10]]},"286":{"position":[[10,10]]},"1566":{"position":[[9,10]]}}}],["uml",{"_index":516,"t":{"1592":{"position":[[0,3]]},"1674":{"position":[[0,3]]}}}],["underli",{"_index":66,"t":{"119":{"position":[[0,10]]}}}],["undisput",{"_index":192,"t":{"380":{"position":[[0,10]]},"382":{"position":[[0,10]]}}}],["unlimit",{"_index":510,"t":{"1547":{"position":[[0,9]]}}}],["unload",{"_index":375,"t":{"916":{"position":[[0,6]]}}}],["untyp",{"_index":500,"t":{"1464":{"position":[[0,7]]}}}],["updat",{"_index":317,"t":{"750":{"position":[[3,6]]},"752":{"position":[[0,8]]},"754":{"position":[[0,8]]}}}],["update_onli",{"_index":316,"t":{"750":{"position":[[3,11]]}}}],["upper",{"_index":234,"t":{"485":{"position":[[0,5]]}}}],["upper_cas",{"_index":233,"t":{"485":{"position":[[0,10]]}}}],["upsert",{"_index":318,"t":{"756":{"position":[[3,6]]},"770":{"position":[[18,6]]}}}],["us",{"_index":3,"t":{"18":{"position":[[0,5]]},"22":{"position":[[0,5]]},"127":{"position":[[0,3]]},"129":{"position":[[6,3]]},"284":{"position":[[18,3]]},"315":{"position":[[0,3]]},"317":{"position":[[0,3]]},"390":{"position":[[0,5]]},"491":{"position":[[5,5]]},"493":{"position":[[9,5]]},"547":{"position":[[0,5]]},"561":{"position":[[0,5]]},"563":{"position":[[4,5]]},"779":{"position":[[0,5]]},"878":{"position":[[0,5]]},"880":{"position":[[4,5]]},"937":{"position":[[7,3]]},"939":{"position":[[9,3]]},"1086":{"position":[[0,3]]},"1142":{"position":[[3,3]]},"1203":{"position":[[0,3]]},"1296":{"position":[[0,5]]},"1298":{"position":[[0,5]]},"1335":{"position":[[0,5]]},"1456":{"position":[[0,3]]},"1458":{"position":[[0,3]]},"1460":{"position":[[0,3]]},"1462":{"position":[[0,3]]},"1513":{"position":[[5,4]]},"1515":{"position":[[9,5]]},"1530":{"position":[[0,4]]},"1604":{"position":[[6,6]]},"1627":{"position":[[25,3]]},"1816":{"position":[[0,3]]},"1822":{"position":[[9,5]]},"1847":{"position":[[0,5]]},"1849":{"position":[[0,5]]},"1918":{"position":[[0,3]]},"1943":{"position":[[0,5]]},"1945":{"position":[[0,5]]},"1952":{"position":[[0,5]]},"1954":{"position":[[4,5]]},"1968":{"position":[[0,3]]}}}],["usag",{"_index":17,"t":{"38":{"position":[[0,5]]},"63":{"position":[[0,5]]},"102":{"position":[[0,5]]},"140":{"position":[[0,5]]},"322":{"position":[[6,5]]},"345":{"position":[[0,5]]},"352":{"position":[[6,5]]},"373":{"position":[[0,5]]},"523":{"position":[[6,5]]},"533":{"position":[[0,5]]},"540":{"position":[[0,5]]},"545":{"position":[[6,5]]},"565":{"position":[[6,5]]},"777":{"position":[[6,5]]},"871":{"position":[[12,5]]},"888":{"position":[[0,5]]},"966":{"position":[[0,5]]},"1047":{"position":[[11,5]]},"1125":{"position":[[0,5]]},"1191":{"position":[[6,5]]},"1200":{"position":[[0,5]]},"1211":{"position":[[0,5]]},"1301":{"position":[[0,5]]},"1479":{"position":[[0,5]]},"1486":{"position":[[0,5]]},"1541":{"position":[[0,5]]},"1654":{"position":[[6,5]]},"1880":{"position":[[0,5]]},"1894":{"position":[[0,5]]}}}],["useless",{"_index":515,"t":{"1580":{"position":[[7,7]]},"1587":{"position":[[7,7]]}}}],["uuid",{"_index":218,"t":{"455":{"position":[[0,4]]}}}],["valid",{"_index":92,"t":{"154":{"position":[[7,10]]},"158":{"position":[[27,10]]}}}],["valu",{"_index":393,"t":{"979":{"position":[[0,5]]},"1051":{"position":[[5,5]]},"1454":{"position":[[25,5]]},"1877":{"position":[[16,5]]}}}],["variou",{"_index":324,"t":{"772":{"position":[[0,7]]},"1882":{"position":[[0,7]]},"1896":{"position":[[0,7]]}}}],["verifi",{"_index":518,"t":{"1611":{"position":[[0,6]]}}}],["version",{"_index":181,"t":{"339":{"position":[[6,7]]},"347":{"position":[[6,7]]},"375":{"position":[[6,7]]}}}],["via",{"_index":545,"t":{"1818":{"position":[[9,3]]}}}],["view",{"_index":51,"t":{"95":{"position":[[13,4]]},"432":{"position":[[10,4]]},"434":{"position":[[11,4]]},"999":{"position":[[3,4]]},"1001":{"position":[[30,4]]},"1268":{"position":[[6,4]]},"1564":{"position":[[0,4]]},"1635":{"position":[[0,4]]}}}],["visibl",{"_index":379,"t":{"928":{"position":[[9,10]]}}}],["vs",{"_index":330,"t":{"792":{"position":[[37,2]]},"1369":{"position":[[18,2]]}}}],["way",{"_index":307,"t":{"731":{"position":[[2,4]]},"993":{"position":[[9,4]]},"1307":{"position":[[4,4]]},"1315":{"position":[[4,4]]}}}],["web",{"_index":85,"t":{"145":{"position":[[8,3]]},"1560":{"position":[[7,3]]}}}],["whereif",{"_index":564,"t":{"1943":{"position":[[6,7]]}}}],["whether",{"_index":272,"t":{"618":{"position":[[15,7]]}}}],["wild",{"_index":283,"t":{"647":{"position":[[3,4]]}}}],["without",{"_index":276,"t":{"621":{"position":[[28,7]]},"720":{"position":[[0,7]]},"1252":{"position":[[17,7]]}}}],["work",{"_index":157,"t":{"286":{"position":[[0,4]]},"882":{"position":[[27,4]]},"1956":{"position":[[0,4]]}}}],["write",{"_index":118,"t":{"207":{"position":[[0,5]]},"1562":{"position":[[0,5]]},"1640":{"position":[[0,5]]},"1644":{"position":[[0,5]]},"1688":{"position":[[0,5]]},"1692":{"position":[[0,5]]},"1714":{"position":[[0,5]]},"1743":{"position":[[0,5]]},"1748":{"position":[[0,5]]},"1752":{"position":[[0,5]]}}}],["判断",{"_index":554,"t":{"1875":{"position":[[6,2]]}}}],["外",{"_index":558,"t":{"1889":{"position":[[7,1]]}}}],["子",{"_index":550,"t":{"1862":{"position":[[2,1]]}}}],["查询",{"_index":551,"t":{"1862":{"position":[[3,2]]}}}],["标准",{"_index":549,"t":{"1862":{"position":[[0,2]]}}}],["连接",{"_index":559,"t":{"1889":{"position":[[8,2]]}}}]],"pipeline":["stemmer"]}},{"documents":[{"i":3,"t":"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","s":"First Blog Post","u":"/jimmer-doc/blog/first-blog-post","h":"","p":2},{"i":5,"t":"This is the summary of a very long blog post, Use a comment to limit blog post size in the list view. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque elementum dignissim ultricies. Fusce rhoncus ipsum tempor eros aliquam consequat. Lorem ipsum dolor sit amet","s":"Long Blog Post","u":"/jimmer-doc/blog/long-blog-post","h":"","p":4},{"i":7,"t":"Blog posts support Docusaurus Markdown features, such as MDX. tip Use the power of React to create interactive blog posts. Click me!","s":"MDX Blog Post","u":"/jimmer-doc/blog/mdx-blog-post","h":"","p":6},{"i":9,"t":"Docusaurus blogging features are powered by the blog plugin. Simply add Markdown files (or folders) to the blog directory. Regular blog authors can be added to authors.yml. The blog post date can be extracted from filenames, such as: 2019-05-30-welcome.md 2019-05-30-welcome/index.md A blog post folder can be convenient to co-locate blog post images: The blog supports tags as well! And if you don't want a blog: just delete this directory, and use blog: false in your Docusaurus config.","s":"Welcome","u":"/jimmer-doc/blog/welcome","h":"","p":8},{"i":11,"t":"Here, we will introduce three types of cache Object Cache Association Cache Calculation Cache","s":"Cache type","u":"/jimmer-doc/docs/cache/cache-type/","h":"","p":10},{"i":13,"t":"Jimmer provides powerful cache support capabilities. Whether to use cache is completely transparent to developers Which caching technologies to use is decided by developers Not only does it support simple object cache, but also property-level cache, including association cache and calculated cache. Ultimately it provides the ability to cache arbitrary data structures, not just simple object cache. Features represented by permission systems allow different users to see different data. Therefore, Jimmer uses multi-view cache to allow different users to see different caches. Powerful cache consistency support. Developers can focus on modifying the database and Jimmer will automatically invalidate cache.","s":"Cache","u":"/jimmer-doc/docs/cache/","h":"","p":12},{"i":15,"t":"Object cache refers to mapping id to entity object. This is the simplest and most basic cache.","s":"Object Cache","u":"/jimmer-doc/docs/cache/cache-type/object","h":"","p":14},{"i":17,"t":"Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new CacheFactory() { @Override public Cache, ?> createObjectCache(@NotNull ImmutableType type) { return new ChainCacheBuilder<>() .add( CaffeineValueBinder .forObject(type) .maximumSize(1024) .duration(Duration.ofHours(1)) .build() ) .add( RedisValueBinder .forObject(type) .redis(connectionFactory) .objectMapper(objectMapper) .duration(Duration.ofHours(24)) .build() ) .build(); } ...omit other code... }; } @Bean fun cacheFactory( connectionFactory: RedisConnectionFactory, objectMapper: ObjectMapper ): KCacheFactory { return object: KCacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ChainCacheBuilder() .add( CaffeineValueBinder .forObject(type) .maximumSize(1024) .duration(Duration.ofHours(1)) .build() ) .add( RedisValueBinder .forObject(type) .redis(connectionFactory) .objectMapper(objectMapper) .duration(Duration.ofHours(24)) .build() ) .build() ...omit other code... } } If you don't want to support object cache for some entity types, just return null. Java Kotlin @Override public Cache, ?> createObjectCache(ImmutableType type) { if (type.getJavaClass() == SomeEntity.class) { return null; } ... } override fun createObjectCache(type: ImmutableType): Cache<*, *>? = if (type.javaClass === SomeEntity::class.java) { null } else { ... }","s":"Enabling Object Caching","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#enabling-object-caching","p":14},{"i":19,"t":"There are two usage patterns that can utilize the object cache: Query entity objects (or their collections) by id (or their collections) Use object fetchers to fetch any non-id fields of associated objects","s":"Using Object Cache","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#using-object-cache","p":14},{"i":21,"t":"Java Kotlin Map bookMap = sqlClient.findMapByIds( Book.class, Arrays.asList(1L, 2L, 3L, 4L, 999L) ); System.out.println(bookMap); val bookMap = sqlClient.findMapByIds( Book::class, listOf(1L, 2L, 3L, 4L, 999L) ) println(bookMap) Jimmer first looks up the data in the cache with keys Book-1, Book-2, Book-3, Book-4 and Book-999. Suppose the data corresponding to these keys cannot be found in the cache: 127.0.0.1:6379> keys Book-* (empty array) So the following SQL is executed to load data from the database: select tb_1_.ID, tb_1_.NAME, tb_1_.EDITION, tb_1_.PRICE, tb_1_.STORE_ID from BOOK tb_1_ where tb_1_.ID in ( ? /* 1 */, ? /* 2 */, ? /* 3 */, ? /* 4 */, ? /* 999 */ ) Jimmer will put the query results into the cache, so we can view this data in the cache: 127.0.0.1:6379> keys Book-* 1) \"Book-4\" 2) \"Book-2\" 3) \"Book-3\" 4) \"Book-1\" 5) \"Book-999\" 127.0.0.1:6379> get Book-1 \"{\\\"id\\\":1,\\\"name\\\":\\\"Learning GraphQL\\\",\\\"edition\\\":1,\\\"price\\\":50.00,\\\"store\\\":{\\\"id\\\":1}}\" 127.0.0.1:6379> get Book-2 \"{\\\"id\\\":2,\\\"name\\\":\\\"Learning GraphQL\\\",\\\"edition\\\":2,\\\"price\\\":55.00,\\\"store\\\":{\\\"id\\\":1}}\" 127.0.0.1:6379> get Book-3 \"{\\\"id\\\":3,\\\"name\\\":\\\"Learning GraphQL\\\",\\\"edition\\\":3,\\\"price\\\":51.00,\\\"store\\\":{\\\"id\\\":1}}\" 127.0.0.1:6379> get Book-4 \"{\\\"id\\\":4,\\\"name\\\":\\\"Effective TypeScript\\\",\\\"edition\\\":1,\\\"price\\\":73.00,\\\"store\\\":{\\\"id\\\":1}}\" 127.0.0.1:6379> get Book-999 \"\" 127.0.0.1:6379> tip The non-existent data Book-999 is also cached with the special value . Undoubtedly, before the data in the cache expires, executing the Java/Kotlin code above again will directly return the data from the cache without any SQL being generated.","s":"Query Based on Id","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#query-based-on-id","p":14},{"i":23,"t":"Java Kotlin BookTable table = Tables.BOOK_TABLE; List books = sqlClient .createQuery(table) .where(table.name().like(\"GraphQL\")) .select( table.fetch( Fetchers.BOOK_FETCHER .allScalarFields() .store( Fetchers.BOOK_STORE_FETCHER .name() ) ) ) .execute(); System.out.println(books); val books = sqlClient .createQuery(Book::class) { where(table.name like \"GraphQL\") select( table.fetchBy { allScalarFields() store { name() } } ) } .execute() println(books) 1st SQL: Query aggregate root First, query the aggregate root object, executing the following SQL: select tb_1_.ID, tb_1_.NAME, tb_1_.EDITION, tb_1_.PRICE, tb_1_.STORE_ID from BOOK tb_1_ where tb_1_.NAME like ? /* %GraphQL% */ The fuzzy query in the code is implemented here to obtain some Book objects. Such objects obtained by direct user queries are called aggregate root objects. caution Jimmer does not cache aggregate objects returned by user queries, because the consistency of such query results cannot be guaranteed. Even if cache them at the cost of sacrificing consistency is required, it is a business need of the user rather than the framework. 2nd SQL: Fetch many-to-one association Book.store The above code will return a series of aggregate root objects. If using the official sample data in the database, it will return 6 aggregate root objects. The object fetcher in the code contains the many-to-one association Book.store and expects to query non-id properties of the associated object (information that cannot be expressed by the foreign key of the current table), so Jimmer will query the associated object for all aggregate root objects. Fortunately, the associated attribute Book.store is based on a real foreign key. The foreign key itself represents the id of the parent object. There is no need to obtain the associated object id through additional queries or association cache. Suppose the foreign key STORE_ID of the 6 BOOK data has two distinct values after deduplication, 1 and 2. Jimmer first looks up the data in the cache with keys BookStore-1 and BookStore-2. Suppose the data corresponding to these keys cannot be found in the cache: 127.0.0.1:6379> keys BookStore-* (empty array) Then the following SQL is executed to load data from the database: select tb_1_.ID, tb_1_.NAME, tb_1_.WEBSITE from BOOK_STORE tb_1_ where tb_1_.ID in ( ? /* 1 */, ? /* 2 */ ) info We only need the ID and NAME fields, but here all fields are queried, which is different from what was discussed earlier in Object Fetcher. Please view: The difference compared to not enabling cache Jimmer will put the query results into the cache, so we can view this data in the cache: 127.0.0.1:6379> keys BookStore-* 1) \"BookStore-1\" 2) \"BookStore-2\" 127.0.0.1:6379> get BookStore-1 \"{\\\"id\\\":1,\\\"name\\\":\\\"O'REILLY\\\",\\\"website\\\":null}\" 127.0.0.1:6379> get BookStore-2 \"{\\\"id\\\":2,\\\"name\\\":\\\"MANNING\\\",\\\"website\\\":null}\" 127.0.0.1:6379> Undoubtedly, before the data in the cache expires, executing the Java/Kotlin code above again will directly return the associated data from the cache without generating the 2nd SQL statement. Finally, Jimmer concatenates the results of the two steps as the final data returned to the user: [ { \"id\":1, \"name\":\"Learning GraphQL\", \"edition\":1, \"price\":50, \"store\":{ \"id\":1, \"name\":\"O'REILLY\" } }, { ...omit... }, { ...omit... }, { \"id\":10, \"name\":\"GraphQL in Action\", \"edition\":1, \"price\":80, \"store\":{ \"id\":2, \"name\":\"MANNING\" } }, { ...omit... }, { ...omit... } ]","s":"Using Object Fetchers","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#using-object-fetchers","p":14},{"i":25,"t":"caution To use Jimmer's automatic cache invalidation, triggers need to be enabled first. If BinLog trigger is enabled, modifying the database by any means can lead to Jimmer's cache consistency intervention. For example, directly execute the following SQL in the SQL IDE: update BOOK_STORE set WEBSITE = 'https://www.manning.com' where ID = 2; If only Transaction trigger is enabled, Jimmer's API must be used to modify the database: Java Kotlin BookStoreTable table = Tables.BOOK_STORE_TABLE; sqlClient .createUpdate(table) .set(table.website(), \"https://www.manning.com\") .where(table.id().eq(2L)) .execute(); sqlClient .createUpdate(BookStore::class) { set(table.website, \"https://www.manning.com\") where(table.id eq 2L) } .execute() Regardless of which way above is used to modify the data, you will see the following log output: Delete data from redis: [BookStore-2]","s":"Cache Invalidation","u":"/jimmer-doc/docs/cache/cache-type/object","h":"#cache-invalidation","p":14},{"i":27,"t":"caution In previous articles on object cache, association cache, and calculated cache, we have discussed in detail how Jimmer automatically deletes affected caches when data is modified. So here we will not repeat the discussion of how Jimmer intelligently invalidates affected caches. The focus of this article is how Jimmer ensures cache deletion operations issued can definitely succeed. Whether it is the fully automatic invalidation of object cache and association cache, or the user assisted invalidation of calculated cache, the cache consistency of Jimmer is driven by triggers. Jimmer triggers are divided into BinLog triggers and Transaction triggers. For different situations, Jimmer adopts different strategies to ensure cache consistency, that is, to ensure that cache invalidation operations must succeed.","s":"Cache Consistency","u":"/jimmer-doc/docs/cache/consistency","h":"","p":26},{"i":29,"t":"When trigger-type is BINLOG_ONLY or BOTH, Jimmer uses the BinLog trigger to invalidate caches. In this case, developers respond to messaging queue notifications, process them simply and then call Jimmer's BinLog API (this user code is very simple, and its complexity can be ignored). Calling the BinLog API initiates all trigger callbacks, including cache invalidation. Take Kafka as an example, make sure to commit the consumption progress after successfully calling the BinLog API, cache invalidation can be guaranteed to eventually succeed.","s":"Consistency of BinLog Trigger (Recommended)","u":"/jimmer-doc/docs/cache/consistency","h":"#consistency-of-binlog-trigger-recommended","p":26},{"i":31,"t":"When trigger-type is TRANSACTION_ONLY, Jimmer will be forced to use the Transaction trigger to invalidate caches. For Transaction triggers: Only modifying the database through Jimmer's own API can trigger all callback behaviors. All trigger callbacks complete before the transaction is committed. If a simple implementation of direct cache invalidation is adopted, any exception during cache invalidation will cause the transaction to be rolled back. Obviously, this implementation is not reasonable. Therefore, when trigger-type is TRANSACTION_ONLY, the cache invalidation operations perceived by the user will be delayed, they will not be executed immediately, but are stored in the JIMMER_TRANS_CACHE_OPERATOR table. caution Jimmer will automatically create the JIMMER_TRANS_CACHE_OPERATOR table. However, the default org.babyfish.jimmer.sql.dialect.DefaultDialect does not support this operation and will throw an exception. Therefore, if cache consistency needs to be driven by transaction trigger, don't use the default DefaultDialect, please explicitly specify the database dialect. Modifications to the JIMMER_TRANS_CACHE_OPERATOR table and business tables belong to the same database local transaction, either both succeed or both fail. After the transaction commits successfully, Jimmer will immediately execute a Flush operation. The so-called Flush operation is to query cache invalidation operations that have not yet been executed from the JIMMER_TRANS_CACHE_OPERATOR table, execute the actual cache invalidation operation, and delete related records if successful. For the Flush operation executed immediately after transaction commit: If successful, it's best to have good real-time. This should be the case most of the time. Even if it fails, it doesn't matter. Jimmer will periodically execute Flush operations to ensure related cache invalidation eventually succeed. The interval of Flush operations is controlled by the global SpringBoot configuration item jimmer.transaction-cache-operator-fixed-delay, which is specified in milliseconds and defaults to 5000.","s":"Consistency of Transaction Trigger","u":"/jimmer-doc/docs/cache/consistency","h":"#consistency-of-transaction-trigger","p":26},{"i":33,"t":"Calculated cache refers to mapping the current object id to the calculated value of the user-defined complex calculated property.","s":"Calculated Cache","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"","p":32},{"i":35,"t":"In the Complex Calculated Properties article, we discussed complex calculated properties in detail. caution This article focuses on calculated cache and does not repeat the introduction to complex calculated properties. Please read complex calculated properties before reading this article. In this article, we will add cache support for the calculated property BookStore.avgPrice defined in complex calculated properties. info To simplify the documentation, this article only discusses BookStore.avgPrice and does not discuss the other association-based calculated property BookStore.newestBooks. Readers can read and run the following official examples: jimmer-examples/java/jimmer-sql jimmer-examples/java/jimmer-sql-graphql jimmer-examples/kotlin/jimmer-sql-kt jimmer-examples/kotlin/jimmer-sql-graphql-kt","s":"Calculated Property Recap","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#calculated-property-recap","p":32},{"i":37,"t":"Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new CacheFactory() { @Override public Cache, ?> createObjectCache(@NotNull ImmutableType type) { ...omit code... } @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { ...omit code... } @Override public Cache, List>> createAssociatedIdListCache(@NotNull ImmutableProp prop) { ...omit code... } @Override public Cache, ?> createResolverCache(ImmutableProp prop) { return createPropCache( prop, Duration.ofMinutes(1), Duration.ofHours(1) ); } private Cache createPropCache( ImmutableProp prop, Duration caffeineDuration, Duration redisDuration ) { return new ChainCacheBuilder<>() .add( CaffeineValueBinder .forProp(prop) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build(); } }; } @Bean fun cacheFactory( connectionFactory: RedisConnectionFactory, objectMapper: ObjectMapper ): KCacheFactory { return object: KCacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ...omit code... override fun createAssociatedIdCache(prop: ImmutableProp): Cache<*, *>? = ...omit code... override fun createAssociatedIdListCache(prop: ImmutableProp): Cache<*, List<*>>? = ...omit code... override fun createResolverCache(prop: ImmutableProp): Cache<*, *> = return createPropCache( prop, Duration.ofMinutes(1), Duration.ofHours(1) ) private fun createPropCache( prop: ImmutableProp, duration: Duration): Cache = ChainCacheBuilder() .add( CaffeineValueBinder .forProp(prop) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build() } }","s":"Enable Calculated Cache","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#enable-calculated-cache","p":32},{"i":39,"t":"Java Kotlin BookStoreTable table = Tables.BOOK_STORE_TABLE; List stores = sqlClient .createQuery(table) .select( table.fetch( Fetchers.BOOK_STORE_FETCHER .allScalarFields() .avgPrice() ) ) .execute(); System.out.println(stores); val stores = sqlClient .createQuery(BookStore::class) { select( table.fetchBy { allScalarFields() avgPrice() } ) } .execute() println(stores) Step 1: Query aggregate root First, query the aggregate root object, executing the following SQL: select tb_1_.ID, tb_1_.NAME, tb_1_.WEBSITE from BOOK_STORE tb_1_ The query in the code is implemented here to obtain some BookStore objects. Such objects obtained by direct user queries are called aggregate root objects. caution Jimmer does not cache aggregate objects returned by user queries, because the consistency of such query results cannot be guaranteed. Even if cache them at the cost of sacrificing consistency is required, it is a business need of the user rather than the framework. Step 2: Convert current object id to calculated value via calculated cache The above code will return a series of aggregate root objects. If using the official sample data in the database, it will return two aggregate root objects. The object fetcher in the code contains the calculated property BookStore.avgPrice The primary keys ID of these 2 BOOK_STOREs are 1 and 2. Jimmer first looks up the data in Redis with keys BookStore.avgPrice-1 and BookStore.avgPrice-2. Suppose the data corresponding to these keys cannot be found in Redis: 127.0.0.1:6379> keys BookStore.avgPrice-* (empty array) So the following SQL is executed to compute the calculated property: select tb_1_.ID, avg(tb_2_.PRICE) from BOOK_STORE tb_1_ left join BOOK tb_2_ on tb_1_.ID = tb_2_.STORE_ID where tb_1_.ID in ( ? /* 1 */, ? /* 2 */ ) group by tb_1_.ID Jimmer will put the query results into Redis, so we can view this data in Redis: 127.0.0.1:6379> keys BookStore.avgPrice-* 1) \"BookStore.avgPrice-2\" 2) \"BookStore.avgPrice-1\" 127.0.0.1:6379> get BookStore.avgPrice-1 \"58.5\" 127.0.0.1:6379> get BookStore.avgPrice-2 \"80.333333\" 127.0.0.1:6379> Thus, the two BookStore objects can obtain the average price of their respective books through their calculated property BookStore.avgPrice. Undoubtedly, before the data in Redis expires, executing the Java/Kotlin code above again will directly return the calculated data from Redis without generating the second SQL statement. Finally, Jimmer concatenates the results of the 3 steps as the final data returned to the user: [ { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"avgPrice\":58.5 }, { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"avgPrice\":80.333333 } ]","s":"Usage","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#usage","p":32},{"i":42,"t":"info Unlike the fully automatic cache invalidation of object cache and association cache, maintaining the consistency of calculated cache requires user assistance. This is because calculated properties introduce custom calculation rules that the ORM framework cannot understand. For the calculated property BookStore.avgPrice, the following two cases will both invalidate the calculated cache: Modifying the STORE_ID foreign key field of the BOOK record will affect the avgPrice cache data of the two bookstores corresponding to the old and new values. Modifying the PRICE field of the BOOK record will invalidate the avgPrice cache data of the bookstore it belongs to. In the Complex Calculated Properties article, a class BookStoreAvgPriceResolver is defined to support the calculated property BookStore.avgPrice. The code is as follows: Java Kotlin BookStoreAvgPriceResolver.java package com.example.business.resolver; import org.babyfish.jimmer.sql.*; import org.babyfish.jimmer.sql.TransientResolver; import org.springframework.stereotype.Component; @Component public class BookStoreAvgPriceResolver implements TransientResolver { @Override public Map resolve(Collection ids) { ...omit code... } @Override public BigDecimal getDefaultValue() { ...omit code... } } BookStoreAvgPriceResolver.kt package com.example.business.resolver import org.babyfish.jimmer.sql.* import org.babyfish.jimmer.sql.kt.KTransientResolver import org.springframework.stereotype.Component @Component class BookStoreAvgPriceResolver( ...omit... ) : KTransientResolver { override fun resolve(ids: Collection): Map { ...omit code... } override fun getDefaultValue(): BigDecimal = ...omit code... } We need to override the following two methods in this class: Java Kotlin BookStoreAvgPriceResolver.java package com.example.business.resolver; import org.babyfish.jimmer.sql.*; import org.babyfish.jimmer.sql.TransientResolver; import org.springframework.stereotype.Component; @Component public class BookStoreAvgPriceResolver implements TransientResolver { // Constructor inject sqlClient private final JSqlClient sqlClient; ...other code omitted... @Override Collection> getAffectedSourceIds(@NotNull EntityEvent> e) { // TODO } @Override Collection> getAffectedSourceIds(@NotNull AssociationEvent e) { // TODO } } BookStoreAvgPriceResolver.kt package com.example.business.resolver import org.babyfish.jimmer.sql.* import org.babyfish.jimmer.sql.kt.KTransientResolver import org.springframework.stereotype.Component @Component class BookStoreAvgPriceResolver( // Constructor inject sqlClient private val sqlClient: KSqlClient ) : KTransientResolver { ...other code omitted... override fun getAffectedSourceIds(e: EntityEvent<*>): Collection<*>? { // TODO } override fun getAffectedSourceIds(e: AssociationEvent): Collection<*>? { // TODO } } These two methods are the built-in trigger response methods of TransientResolver that are executed automatically when the database changes. They are responsible for automatically clearing the computed cache when the database changes. Next, let's implement these two methods.","s":"Responding to Triggers","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#responding-to-triggers","p":32},{"i":44,"t":"Users can change the association between BOOK_STORE and BOOK by modifying the STORE_ID foreign key of the BOOK table. This will inevitably affect BookStore.avgPrice of some bookstores. tip If watching for changes to the Book.store one-to-many association, the old and new values before and after the modification are two parent objects that need to be considered separately, making the code slightly more cumbersome. Luckily, the entity model in this example has the reverse one-to-many association BookStore.books. When listening for changes to BookStore.books, we only need to consider the id of the current BookStore object, simplifying the code. Implement getAffectedSourceIds(AssociationEvent) as follows: Java Kotlin @Override public Collection> getAffectedSourceIds(AssociationEvent e) { if (sqlClient.getCaches().isAffectedBy(e) && ❶ e.getImmutableProp() == BookStoreProps.BOOKS.unwrap() ❷ ) { return Collections.singletonList(e.getSourceId()); ❸ } return null; } override fun getAffectedSourceIds(e: AssociationEvent): Collection<*>? { if (sqlClient.caches.isAffectedBy(e) && ❶ e.immutableProp == BookProps.BOOKS ❷ ) { return listOf(e.sourceId) ❸ } return null } ❶ If the trigger type is set to BOTH, any modification-caused trigger event notifications will be executed twice. note The 1st time: e.connection is non-null, indicating this is a notification from the Transaction trigger. The 2nd time: e.connection is null, indicating this is a notification from the BinLog trigger. However, the cache consistency maintenance work only needs to be done once, no need to do it twice. sqlClient.caches.isAffectedBy(e) can solve this problem, so that even if the trigger type is set to BOTH, the code here will only execute once. caution No matter whether Jimmer's trigger type is set to BOTH or not, it is recommended to include this check as a disciplinary measure. ❷ If the BookStore.books one-to-many association is modified ❹ Then the sourceId of this association modification event (i.e. the BookStore id) needs to have the computed property cache BookStore.avgPrice cleared. Now let's verify the effect of modifying Book.store: If BinLog trigger is enabled, modifying the database by any means can lead to Jimmer's cache consistency intervention. For example, directly execute the following SQL in the SQL IDE: update BOOK /* Old value: 1, New value: 2 */ set STORE_ID = 2 where ID = 7; If only Transaction trigger is enabled, Jimmer's API must be used to modify the database: Java Kotlin BookTable table = Tables.BOOK_TABLE; sqlClient .createUpdate(table) // Old value: 1L, New value: 2L .set(table.store().id, 2L) .where(table.id().eq(7L)) .execute(); sqlClient .createUpdate(Book::class) { // Old value: 1L, New value: 2L set(table.store.id, 2L) where(table.id eq 7L) } .execute() Regardless of which way above is used to modify the data, you will see the following log output: Delete data from redis: [Book-7] Delete data from redis: [Book.store-7] Delete data from redis: [BookStore.avgPrice-1] ❶ Delete data from redis: [BookStore.books-1] Delete data from redis: [BookStore.avgPrice-2] ❷ Delete data from redis: [BookStore.books-2] ❶ The calculated cache BookStore.avgPrice-1 of the parent object referenced by the old foreign key 1 is deleted. ❷ The calculated cache BookStore.avgPrice-2 of the parent object referenced by the new foreign key 2 is deleted.","s":"When BOOK.STORE_ID is modified","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#when-bookstore_id-is-modified","p":32},{"i":46,"t":"Users can also modify the price of books, which will inevitably affect BookStore.avgPrice of the bookstore it belongs to. Implement getAffectedSourceIds(EntityEvent>): Java Kotlin @Override public Collection> getAffectedSourceIds(EntityEvent> e) { if (sqlClient().getCaches().isAffectedBy(e) && ❶ !e.isEvict() && ❷ e.getImmutableType().getJavaClass() == Book.class) { ❸ Ref storeRef = e.getUnchangedRef(BookProps.STORE); ❹ if (storeRef != null && storeRef.getValue() != null && e.isChanged(BookProps.PRICE)) { ❺ return Collections.singletonList(storeRef.getValue().id()); ❻ } } return null; } override fun getAffectedSourceIds(e: EntityEvent<*>): Collection<*>? { if (sqlClient.caches.isAffectedBy(e) && ❶ !e.isEvict && ❷ e.getImmutableType().javaClass == Book::class.java ❸ ) { val store = e.getUnchangedRef(Book::store)?.value ❹ if (store !== null && e.isChanged(Book::price)) { ❺ return listOf(store.id) ❻ } } return null } ❶ If the trigger type is set to BOTH, any modification-caused trigger event notifications will be executed twice. note The 1st time: e.connection is non-null, indicating this is a notification from the Transaction trigger. The 2nd time: e.connection is null, indicating this is a notification from the BinLog trigger. However, the cache consistency maintenance work only needs to be done once, no need to do it twice. sqlClient.caches.isAffectedBy(e) can solve this problem, so that even if the trigger type is set to BOTH, the code here will only execute once. caution No matter whether Jimmer's trigger type is set to BOTH or not, it is recommended to include this check as a disciplinary measure. ❷ There are two reasons for Jimmer's event callbacks, whether it's EntityEvent or AssociationEvent. Explicitly know that the database has been modified In this case, isEvict() returns false. Users can access any property of EntityEvent/AssociationEvent. In the process of automatic cache eviction with cascading effect, the cache of an object/association needs to be evicted In this case, isEvict() returns true. Except for EntityEvent.id/AssociationEvent.sourceId, the event object does not support any other properties like EntityEvent.newEntity, AssociationEvent.attachedTargetId. Here, we need to explicitly determine if the user has modified the PRICE field of the BOOK table, so we must check isEvict() is false. warning Whether to check e.isEvict() must be decided on a case-by-case basis. ❸ Confirm that the current event was triggered because an object of type Book was modified. ❹ ❺ e.getUnchangedRef(BookProps.STORE)/e.getUnchangedRef(Book::store) returns a Ref wrapper object containing the unchanged associated object (only id property) or null, if the Book.store association based on foreign key was not modified. info If the returned Ref wrapper object itself is null, it means this property was modified rather than being Unchanged. If the returned Ref wrapper object is non-null but its internal value is null, it means this property was not modified and its value has remained null all along. Ultimately, we expect the BOOK.STORE_ID foreign key field was not modified and has remained non-null. tip We don't need to consider the case where the foreign key field was modified here, because the other method we discussed earlier, getAffectedSourceIds(AssociationEvent), will properly handle that case. ❻ If all the above conditions are met, then the computed property cache BookStore.avgPrice of the BookStore parent object that the price-modified Book belongs to needs to be cleared. Now let's verify the effect of modifying Book.price: If BinLog trigger is enabled, modifying the database by any means can lead to Jimmer's cache consistency intervention. For example, directly execute the following SQL in the SQL IDE: update BOOK set PRICE = PRICE + 1 where ID = 7; If only Transaction trigger is enabled, Jimmer's API must be used to modify the database: Java Kotlin BookTable table = Tables.BOOK_TABLE; sqlClient .createUpdate(table) .set(table.price(), table.price().plus(BigDecimal.ONE)) .where(table.id().eq(7L)) .execute(); sqlClient .createUpdate(Book::class) { set(table.price, table.price + BigDecimal.ONE) where(table.id eq 7L) } .execute() Regardless of which way above is used to modify the data, you will see the following log output: Delete data from redis: [BookStore.avgPrice-1] ❶ Delete data from redis: [Book-7] ❶ The calculated cache BookStore.avgPrice-1 of the parent object referenced by the foreign key is deleted.","s":"Modifying BOOK.PRICE","u":"/jimmer-doc/docs/cache/cache-type/calculation","h":"#modifying-bookprice","p":32},{"i":48,"t":"Features represented by permission systems allow different users to see different data. Therefore, Jimmer uses multi-view cache to allow different users to see different caches.","s":"Multi-view Cache","u":"/jimmer-doc/docs/cache/multiview-cache/","h":"","p":47},{"i":51,"t":"Using multi-view caches is relatively strict and the following three conditions must be met at the same time: The properties that need multi-view cache must be explicitly specified. Cache is multi-layered. Multiple Binder objects must be specified for the ChainCacheBuilder used to build the cache instance, i.e. LoadingBinder/KLoadingBinder or SimpleBinder/KSimpleBinder. For multi-view caches, all Binder objects must implement the LoadingBinder.Parameterized/KLoadingBinder.Parameterized or SimpleBinder.Parameterized/KSimpleBinder.Parameterized interface. Otherwise, the final cache created by ChainCacheBuilder is a single-view cache. The filtering rules for association properties and the calculation rules for calculated properties must be cache friendly. For association properties, all global filters that affect their associated objects must be cache friendly filters. If any one filter is not cache friendly, it may cause the all affected properties to be unable to use cache. For user-defined cache filters, the CacheableFilter/KCacheableFilter interface must be implemented. For the @LogicalDeleted, its useMultiViewCache property must be configured as true (this will cause its built-in global filter to implement the CacheableFilter/KCacheableFilter interface). For calculated properties, the getParameterMapRef method of TransientResolver/KTransientResolver must not return null. The object fetch cannot use property-level filters. If these prerequisite conditions are not fully met, even if cache is specified for association or calculated properties, Jimmer will abandon them. Although the reasons have been explained in detail in previous documents, troubleshooting such issues during actual development is inconvenient. To quickly inform developers of the fact that property-level cache did not take effect and the reason, Jimmer defines a callback interface as follows: package org.babyfish.jimmer.sql.cache; import org.babyfish.jimmer.meta.ImmutableProp; public interface CacheAbandonedCallback { void abandoned(ImmutableProp prop, Reason reason); enum Reason { CACHEABLE_FILTER_REQUIRED, PARAMETERIZED_CACHE_REQUIRED, FIELD_FILTER_USED } } This callback interface tells developers that although cache is specified for a property, it is not adopted by Jimmer, and the reason. Its abandoned method has two parameters: prop: Which property does not adopt the cache configured by the user. reason: The reason why the cache of this property is not adopted. There are three possible values: CACHEABLE_FILTER_REQUIRED: The associated objects are affected by some global filters, but not all filters implement the CacheableFilter/KCacheableFilter interface. PARAMETERIZED_CACHE_REQUIRED: The getParameters method of some CacheableFilter/KCacheableFilter objects affecting the association properties or the getParameterMapRef method of TransientResolver/KTransientResolver implementing the calculated properties returns a Map of non-zero length, but the cache configured for that property by the developer is not a multi-view cache. FIELD_FILTER_USED: The developer uses property-level filters for the property in object fetchers. Developers can implement the CacheAbandonedCallback interface themselves, create an object, and register it with SqlClient. There is no limit on the number of registered callback objects.","s":"CacheAbandonedCallback","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#cacheabandonedcallback","p":49},{"i":53,"t":"There are two ways to register CacheAbandonedCallback for Jimmer: Using Spring Boot Starter Just decorate the implementation class of CacheAbandonedCallback with @Component: Java Kotlin @Component public class MyCallback implements CacheAbandonedCallback { ...omit code... } @Component class MyCallback : CacheAbandonedCallback { ...omit code... } Using underlying API Java Kotlin JSqlClient sqlClient = JSqlClient .newBuilder() .addCacheAbandonedCallback( new CacheAbandonedCallback() { ...omit code... } ) ...omit other configuration... .build(); val sqlClient = newKSqlClient { addCacheAbandonedCallback( object: CacheAbandonedCallback { ...omit code... } ) ...omit other configuration... }","s":"Registering Callback","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#registering-callback","p":49},{"i":55,"t":"If no callback implementation is registered by the user, the Spring Boot Starter will register a default callback implementation by default, outputting the reason why the cache is not adopted as a warning log, for example: !!!Jimmer warning!!! Property-level cache is abandoned. Property: `com.yourcompany.yourproject.model.BookStore.books` Reason: CACHEABLE_FILTER_REQUIRED","s":"Default Behavior of Spring Boot Starter","u":"/jimmer-doc/docs/cache/multiview-cache/abandoned-callback","h":"#default-behavior-of-spring-boot-starter","p":49},{"i":58,"t":"Association cache refers to mapping the current object id to the associated object id or collection. Where: BookStore.books-*: One-to-many association cache Book.store-*: Many-to-one association cache Book.authors-*: Many-to-many association cache Author.books-*: Many-to-many association cache caution Unlike other association caches, there is one scenario that does not require using one-to-one or many-to-one association cache. If a one-to-one or many-to-one association is based on a real foreign key with a corresponding foreign key constraint in the database, then the foreign key itself is the associated object id, and association cache is not required. In other cases, Jimmer will use one-to-one or many-to-one association cache. These cases include: The referenced association property is reverse side That is, @OneToOne's mappedBy is configured. The referenced association property is based on a pseudo foreign key A pseudo foreign key means that it is conceptually a foreign key in the developer's mind, but there is no corresponding foreign key constraint in the database. The pseudo foreign key field may contain illegal values, the non-null value does not mean the associated object exists, so association cache is required to filter out valid associated objects. The referenced association property is based on a join table rather than a foreign key. When implementing GraphQL with Jimmer, Object Fetcher (GraphQL and Object Fetchers are homogenous functions) should not be used in aggregate root queries, but object fetcher were incorrectly used in aggregate root queries to obtain objects without foreign keys. However, the GraphQL request body contains many-to-one associations. In the official sample code included, the many-to-one association Book.store is based on a real foreign key, so its many-to-one cache will not be used. Therefore, the examples in this article use the one-to-many association BookStore.books and the many-to-many association Book.authors.","s":"Association Cache","u":"/jimmer-doc/docs/cache/cache-type/association","h":"","p":57},{"i":60,"t":"Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new CacheFactory() { @Override public Cache, ?> createObjectCache(@NotNull ImmutableType type) { ...omit code... } // Map current object id to associated object id // Applies to one-to-one and many-to-one associations @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { return createPropCache( prop, Duration.ofMinutes(10), Duration.ofHours(10) ); } // Map current object id to collection of associated object ids // Applies to one-to-many and many-to-many associations @Override public Cache, List>> createAssociatedIdListCache(@NotNull ImmutableProp prop) { return createPropCache( prop, Duration.ofMinutes(5), Duration.ofHours(5) ); } private Cache createPropCache( ImmutableProp prop, Duration caffeineDuration, Duration redisDuration ) { return new ChainCacheBuilder<>() .add( CaffeineValueBinder .forObject(type) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build(); } ...omit other code... }; } @Bean fun cacheFactory( connectionFactory: RedisConnectionFactory, objectMapper: ObjectMapper ): KCacheFactory { return object: KCacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ...omit code... // Map current object id to associated object id // Applies to one-to-one and many-to-one associations override fun createAssociatedIdCache(prop: ImmutableProp): Cache<*, *>? = createPropCache( prop, Duration.ofMinutes(10), Duration.ofHours(10) ) // Map current object id to collection of associated object ids // Applies to one-to-many and many-to-many associations override fun createAssociatedIdListCache(prop: ImmutableProp): Cache<*, List<*>>? = createPropCache( prop, Duration.ofMinutes(5), Duration.ofHours(5) ) private fun createPropCache(prop: ImmutableProp, duration: Duration): Cache = ChainCacheBuilder() .add( CaffeineValueBinder .forProp(prop) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build() ...omit other code... } }","s":"Enabling Association Cache","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#enabling-association-cache","p":57},{"i":62,"t":"caution For collection type associations, if we use the field filter of object fetchers to implement association-level sorting, it will cause Jimmer to ignore association cache. To make full use of association cache while keeping the sorting of the associated object collection returned by the object fetcher query controllable, you can specify the default sorting statically on the entity. BookStore.books Java Kotlin BookStore.java @Entity public interface BookStore { @OneToMany( mappedBy = \"store\", orderedProps = { @OrderedProp(\"name\"), @OrderedProp(value = \"edition\", desc = true) } ) List books(); ...omit other code... } BookStore.kt @Entity interface BookStore { @OneToMany( mappedBy = \"store\", orderedProps = { @OrderedProp(\"name\"), @OrderedProp(value = \"edition\", desc = true) } ) val books : List ...omit other code... } Book.authors Java Kotlin Book.java @Entity public interface Book { @ManyToMany( orderedProps = { @OrderedProp(\"firstName\"), @OrderedProp(\"lastName\") } ) List authors(); ...omit other code... } Book.kt @Entity interface Book { @ManyToMany( orderedProps = { @OrderedProp(\"firstName\"), @OrderedProp(\"lastName\") } ) val authors : List ...omit other code... }","s":"Sorting Collection Associations","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#sorting-collection-associations","p":57},{"i":64,"t":"As mentioned at the beginning of this article, the examples here are based on the one-to-many association BookStore.books and the many-to-many association Book.authors.","s":"Usage","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#usage","p":57},{"i":66,"t":"Java Kotlin BookStoreTable table = Tables.BOOK_STORE_TABLE; List stores = sqlClient .createQuery(table) .select( table.fetch( Fetchers.BOOK_STORE_FETCHER .allScalarFields() .books( Fetchers.BOOK_FETCHER .allScalarFields() ) ) ) .execute(); System.out.println(stores); val stores = sqlClient .createQuery(BookStore::class) { select( table.fetchBy { allScalarFields() books { allScalarFields() } } ) } .execute() println(stores) Step 1: Query aggregate root First, query the aggregate root object, executing the following SQL: select tb_1_.ID, tb_1_.NAME, tb_1_.WEBSITE from BOOK_STORE tb_1_ The query in the code is implemented here to obtain some BookStore objects. Such objects obtained by direct user queries are called aggregate root objects. caution Jimmer does not cache aggregate objects returned by user queries, because the consistency of such query results cannot be guaranteed. Even if cache them at the cost of sacrificing consistency is required, it is a business need of the user rather than the framework. Step 2: Convert current object id to associated object id via association cache The above code will return a series of aggregate root objects. If using the official sample data in the database, it will return two aggregate root objects. The object fetcher in the code contains the one-to-many association BookStore.books The primary keys ID of these 2 BOOK_STOREs are 1 and 2. Jimmer first looks up the data in Redis with keys BookStore.books-1 and BookStore.books-2. Suppose the data corresponding to these keys cannot be found in Redis: 127.0.0.1:6379> keys BookStore.books-* (empty array) So the following SQL is executed to load data from the database: select tb_1_.STORE_ID, tb_1_.ID, tb_1_.NAME, tb_1_.EDITION, tb_1_.PRICE from BOOK tb_1_ where tb_1_.STORE_ID in ( ? /* 1 */, ? /* 2 */ ) order by tb_1_.NAME asc, tb_1_.EDITION desc Jimmer will put the results of the query into Redis, so we can view this data in Redis: 127.0.0.1:6379> keys BookStore.books-* 1) \"BookStore.books-2\" 2) \"BookStore.books-1\" 127.0.0.1:6379> get BookStore.books-1 \"[6,5,4,3,2,1,9,8,7]\" 127.0.0.1:6379> get BookStore.books-2 \"[12,11,10]\" 127.0.0.1:6379> Thus, the two BookStore objects can obtain the associated object id collections of their respective one-to-many associations BookStore.books. Undoubtedly, before the data in Redis expires, executing the Java/Kotlin code above again will directly return the associated data from Redis without generating the second SQL statement. Step 3: Convert associated object id to associated object via object cache Such operations have been discussed in detail in Object Cache, so they are not repeated here. This article focuses on association cache. caution In the cache configuration, if association cache is enabled for an association property but object cache is not enabled for its associated object type, an exception will be thrown. info Previously in Object Fetcher, we saw that Jimmer only needs one SQL statement to query all associated objects based on a batch of current objects, but here two SQL statements are needed, please view: The difference compared to not enabling cache Finally, Jimmer concatenates the results of the two steps as the final data returned to the user: [ { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"books\":[ { \"id\":6, \"name\":\"Effective TypeScript\", \"edition\":3, \"price\":88 }, { \"id\":5, ...omit... }, { \"id\":4, ...omit... }, { \"id\":3, ...omit... }, { \"id\":2, ...omit... }, { \"id\":1, ...omit... }, { \"id\":9, ...omit... }, { \"id\":8, ...omit... }, { \"id\":7, ...omit... } ] }, { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"books\":[ { \"id\":12, \"name\":\"GraphQL in Action\", \"edition\":3, \"price\":80 }, { \"id\":11, ...omit... }, { \"id\":10, ...omit... } ] } ]","s":"One-to-Many: BookStore.books","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#one-to-many-bookstorebooks","p":57},{"i":68,"t":"Java Kotlin BookTable table = Tables.BOOK_TABLE; List books = sqlClient .createQuery(table) .where(table.edition().eq(1)) .select( table.fetch( Fetchers.BOOK_FETCHER .allScalarFields() .authors( Fetchers.AUTHOR_FETCHER .allScalarFields() ) ) ) .execute(); System.out.println(books); val books = sqlClient .createQuery(Book::class) { where(table.edition eq 1) select( table.fetchBy { allScalarFields() authors { allScalarFields() } } ) } .execute() println(books) Step 1: Query aggregate root First, query the aggregate root object, executing the following SQL: select tb_1_.ID, tb_1_.NAME, tb_1_.EDITION, tb_1_.PRICE from BOOK tb_1_ where tb_1_.EDITION = ? /* 1 */ The query in the code is implemented here to obtain some Book objects. Such objects obtained by direct user queries are called aggregate root objects. caution Jimmer does not cache aggregate objects returned by user queries, because the consistency of such query results cannot be guaranteed. Even if cache them at the cost of sacrificing consistency is required, it is a business need of the user rather than the framework. Step 2: Convert current object id to associated object ids via association cache The above code will return a series of aggregate root objects. If using the official sample data in the database, it will return 4 aggregate root objects. The object fetcher in the code contains the many-to-many association Book.authors The primary keys ID of these 4 BOOKs are 1, 4, 7 and 10. Jimmer first looks up the data in Redis with keys Book.authors-1, Book.authors-4, Book.authors-7 and Book.authors-10. Suppose the data corresponding to these keys cannot be found in Redis: 127.0.0.1:6379> keys Book.authors-* (empty array) So the following SQL is executed to load data from the database: select tb_1_.BOOK_ID, tb_1_.AUTHOR_ID from BOOK_AUTHOR_MAPPING tb_1_ inner join AUTHOR tb_3_ on tb_1_.AUTHOR_ID = tb_3_.ID where tb_1_.BOOK_ID in ( ? /* 1 */, ? /* 4 */, ? /* 7 */, ? /* 10 */ ) order by tb_3_.FIRST_NAME asc, tb_3_.LAST_NAME asc note If no default sort is specified for the association property Book.authors via @ManyToMany.orderedProps, the join here will not appear. Jimmer will put the results of the query into Redis, so we can view this data in Redis: 127.0.0.1:6379> keys Book.authors-* 1) \"Book.authors-4\" 2) \"Book.authors-1\" 3) \"Book.authors-10\" 4) \"Book.authors-7\" 127.0.0.1:6379> get Book.authors-1 \"[2,1]\" 127.0.0.1:6379> get Book.authors-4 \"[3]\" 127.0.0.1:6379> get Book.authors-7 \"[4]\" 127.0.0.1:6379> get Book.authors-10 \"[5]\" 127.0.0.1:6379> Thus, we have obtained the associated object id collections that the 4 Book objects can get through their respective many-to-many association Book.authors. Undoubtedly, before the data in Redis expires, executing the Java/Kotlin code above again will directly return the associated data from Redis without generating the second SQL statement. Step 3: Convert associated object id to associated object via object cache Such operations have been discussed in detail in Object Cache, so they are not repeated here. This article focuses on association cache. caution In the cache configuration, if association cache is enabled for an association property but object cache is not enabled for its associated object type, an exception will be thrown. info Previously in Object Fetcher, we saw that Jimmer only needs one SQL statement to query all associated objects based on a batch of current objects, but here two SQL statements are needed, please view: The difference compared to not enabling cache Finally, Jimmer concatenates the 3 steps results as the final data returned to the user: [ { \"id\": 1, \"name\": \"Learning GraphQL\", \"edition\": 1, \"price\": 51, \"authors\": [ { \"id\": 2, \"firstName\": \"Alex\", \"lastName\": \"Banks\", \"gender\": \"MALE\" }, { \"id\": 1, \"firstName\": \"Eve\", \"lastName\": \"Procello\", \"gender\": \"FEMALE\" } ] }, { \"id\": 4, \"name\": \"Effective TypeScript\", \"edition\": 1, \"price\": 73, \"authors\": [...omit...] }, { \"id\": 7, \"name\": \"Programming TypeScript\", \"edition\": 1, \"price\": 47.5, \"authors\": [...omit...] }, { \"id\": 10, \"name\": \"GraphQL in Action\", \"edition\": 1, \"price\": 80, \"authors\": [...omit...] } ]","s":"Many-to-Many: Book.authors","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#many-to-many-bookauthors","p":57},{"i":70,"t":"caution To use Jimmer's automatic cache invalidation, triggers need to be enabled first.","s":"Cache Invalidation","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#cache-invalidation","p":57},{"i":72,"t":"Modify the foreign key STORE_ID of the BOOK table, Jimmer automatically deletes the many-to-one association cache Book.store and the one-to-many association cache BookStore.books. If BinLog trigger is enabled, modifying the database by any means can lead to Jimmer's cache consistency intervention. For example, directly execute the following SQL in the SQL IDE: update BOOK /* Old value: 1, New value: 2 */ set STORE_ID = 2 where ID = 7; If only Transaction trigger is enabled, Jimmer's API must be used to modify the database: Java Kotlin BookTable table = Tables.BOOK_TABLE; sqlClient .createUpdate(table) // Old value: 1L, New value: 2L .set(table.store().id, 2L) .where(table.id().eq(7L)) .execute(); sqlClient .createUpdate(Book::class) { // Old value: 1L, New value: 2L set(table.store.id, 2L) where(table.id eq 7L) } .execute() Regardless of which way above is used to modify the data, you will see the following log output: Delete data from redis: [Book-7] Delete data from redis: [Book.store-7] ❶ Delete data from redis: [BookStore.books-1] ❷ Delete data from redis: [BookStore.books-2] ❸ ❶ For the Book object with id 7, its many-to-one association cache Book.store is deleted. ❷ For the BookStore object with id 1 (old value before modification), its one-to-many association cache BookStore.books is deleted. ❸ For the BookStore object with id 2 (new value before modification), its one-to-many association cache BookStore.books is deleted.","s":"One-to-Many: BookStore.books","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#one-to-many-bookstorebooks-1","p":57},{"i":74,"t":"Inserting data into the join table BOOK_AUTHOR_MAPPING automatically deletes the many-to-many association caches Book.authors and Author.books. note Deleting data from the join table can achieve the same effect. Here insertion is used to demonstrate the effect. If BinLog trigger is enabled, modifying the database by any means can lead to Jimmer's cache consistency intervention. For example, directly execute the following SQL in the SQL IDE: insert into BOOK_AUTHOR_MAPPING(BOOK_ID, AUTHOR_ID) values(10, 3); If only Transaction trigger is enabled, Jimmer's API must be used to modify the database: Java Kotlin sqlClient .getAssociations(BookProps.AUTHORS) .save(10L, 3L); sqlClient .getAssociations(Book::authors) .save(10L, 3L); Regardless of which way above is used to modify the data, you will see the following log output: Delete data from redis: [Book.authors-10] ❶ Delete data from redis: [Author.books-3] ❷ ❶ For the Book object with id 10, its many-to-many association cache Book.authors is deleted. ❷ For the Author object with id 3, its many-to-many association cache Author.books is deleted.","s":"Many-to-Many: Book.authors","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#many-to-many-bookauthors-1","p":57},{"i":76,"t":"If associated objects support logical deletion, association caching is still supported by default. warning However, once the logical deletion is ignored or reversed, association caching will be ignored.","s":"Notes on Logical Deletion","u":"/jimmer-doc/docs/cache/cache-type/association","h":"#notes-on-logical-deletion","p":57},{"i":79,"t":"Up to now, the caches we have introduced are all single-view caches, where all clients see the same cached data. However, often times, different clients will see different persistent data, which is usually caused by permission systems. Since different clients will see different persistent data, we naturally also expect different clients to see different cache data, that is, the cache provides different views for different clients. Multi-view cache solves this problem very well by allowing different clients to see different caches. caution Unlike previous discussions where cache can be categorized into object cache, association cache and calculated cache, multi-view cache is not adding a new category to the existing taxonomy, but rather another dimension of characteristics. Except for object cache, both association cache and calculated cache can be combined with multi-view cache. Single-view Cache Multi-view Cache Object Cache Object Cache NA Association Cache Single-view Association Cache Multi-view Association Cache Calculated Cache Single-view Calculated Cache Multi-view Calculated Cache info We can refer to association cache and calculated cache together as property cache. Therefore, this table can also be interpreted as property cache can be multi-viewed.","s":"Concepts","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#concepts","p":77},{"i":81,"t":"Multi-view cache is caused by user defined global filters. info As long as an entity is applied with a user defined global filter, all association caches targeting it calculated caches relying on these association caches need to be multi-viewed. For example, if an user defined global filter is added to Book, then properties like: Association properties targeting Book, such as BookStore.books, Author.books Calculated properties relying on the above association properties, such as BookStore.avgPrice, BookStore.newestBooks will be sensitive to the filter, that is, different filtering conditions will result in different data seen by different clients. caution These filter-sensitive properties either do not support cache or support multi-view cache. Configuring single-view cache for them will be considered invalid and the cache configuration will be ignored. Don't worry. Jimmer will tell developers why cache is abandoned.","s":"Scenarios","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#scenarios","p":77},{"i":83,"t":"SubKey is an important concept for multi-view cache and a prerequisite for subsequent documentation. Let's first take a look at the structure of single-view cache Key Value Book-10 {\"id\":10,\"name\":\"GraphQL in Action\",...} Book.authors-1 [1,2] BookStore.avgPrice-2 80.333333 Here we list examples of object cache, association cache and calculated cache. Although the cache types are different, the cache structures are unified simple KV structures. Now let's take a look at an example of multi-view cache: Key SubKey Value BookStore.books-1 {} [6,5,4,3,2,1,9,8,7] {\"tenant\":\"a\"} [5,3,1,9,7] {\"tenant\":\"b\"} [6,4,2,8] {\"module\":\"x\"} [6,5,3,2,9,8] {\"module\":\"x\",\"tenant\":\"a\"} [5,3,9] {\"module\":\"x\",\"tenant\":\"b\"} [6,2,8] {\"module\":\"y\"} [4,1,7] {\"module\":\"y\",\"tenant\":\"a\"} [1,7] {\"module\":\"y\",\"tenant\":\"b\"} [4] BookStore.books-2 {} [12,11,10] {\"tenant\":\"a\"} [11] {\"tenant\":\"b\"} [12,10] {\"module\":\"x\"} [12,11] {\"module\":\"x\",\"tenant\":\"a\"} [11] {\"module\":\"x\",\"tenant\":\"b\"} [12] {} [10] {\"tenant\":\"a\"} [] {\"tenant\":\"b\"} [10] Multi-view cache is no longer a simple KV structure, but a nested two-level KV structure. tip For Redis, this structure is Redis Hashes. In this case, the SubKey in the table is the Hash Key in Redis. Obviously, compared to single-view cache, multi-view cache splits the data into finer granularity by sub key, allowing different clients to see different data. Key The Key in multi-view cache is no different from the key in single-view cache, representing a specific entity property, decided by Jimmer. SubKey The key characteristic of multi-view cache. The permission system allows different clients to have different sub keys, eventually extracting different data from the cache. info In Jimmer, SubKey must be the JSON-serialized string of java.util.SortedMap. This SortedMap must use the default sorting rule without custom Comparator. This is very important. For example, SubKey can only be {\"module\":\"x\",\"tenant\":\"a\"}, not {tenant:\"a\", \"module\":\"x\"} which is different but equivalent. This ensures there is no redundant information internally in multi-view cache. Multi-view cache is only for property cache, i.e. association cache and calculated cache. So association properties and complex calculated properties must specify sub key for their multi-view caches.","s":"SubKey","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey","p":77},{"i":85,"t":"For association properties, the necessity of multi-view cache must be caused by the associated entity being affected by user defined global filters. Supporting multi-view cache by merely implementing the Filter/KFilter interface is not enough. The CacheableFilter/KCacheableFilter interface must be implemented. Java Kotlin CacheableFilter.java package org.babyfish.jimmer.sql.filter; public interface CacheableFilter
extends Filter
{ SortedMap getParameters(); ...other code omitted... } KCacheableFilter.kt package org.babyfish.jimmer.sql.kt.filter interface KCacheableFilter : KFilter { fun getParameters(): SortedMap? ...other code omitted... } Users need to implement the getParameters() method to contribute part of the information to sub key. info When multiple CacheableFilter/KCacheableFilter affect the associated entity, the data returned by the getParameters() method of each filter object is merged together as the SubKey.","s":"SubKey of Association Properties","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey-of-association-properties","p":77},{"i":87,"t":"Implementing complex calculated properties requires implementing the TransientResolver/KTransientResolver interface. Java Kotlin TransientResolver.java package org.babyfish.jimmer.sql; import org.babyfish.jimmer.lang.Ref; import java.util.SortedMap; public interface TransientResolver { default Ref> getParameterMapRef() { return Ref.empty(); } ...other code omitted... } KTransientResolver.kt package org.babyfish.jimmer.sql.kt import org.babyfish.jimmer.lang.Ref interface KTransientResolver : TransientResolver { override fun getParameterMapRef(): Ref?>? = Ref.empty() ...other code omitted... } This method returns the Ref which is the wrapper of SortedMap. If Ref itself is null, it means getting sub key is difficult and multi-view cache cannot be applied to the calculated property. info In this case, Jimmer will tell developers why cache is abandoned. Otherwise, the internal value of Ref represents the sub key of the current calculated property. info When invalidating cache, Jimmer will automatically delete invalid cached by key. Cached items of multi-view cache are always deleted as a whole based on Key rather than partially based on Key + SubKey, to maximize the relative simplicity of multi-view cache.","s":"SubKey of Complex Calculated Properties","u":"/jimmer-doc/docs/cache/multiview-cache/concept","h":"#subkey-of-complex-calculated-properties","p":77},{"i":92,"t":"In the User defined Filters documentation, we introduced that custom global filters need to implement the Filter/KFilter interface. However, ordinary filters defined using this interface are not cache-friendly. Taking the Book entity as an example, if a cache-unfriendly global filter is set for it, it will cause all the following filter-sensitive properties Association properties targeting Book, such as BookStore.books, Author.books Calculated properties relying on the above association properties, such as BookStore.avgPrice, BookStore.newestBooks to become uncacheable. Jimmer uses the CacheableFilter/KCacheableFilter interface to define cache-friendly filters: Java Kotlin CacheableFilter.java package org.babyfish.jimmer.sql.filter; import org.babyfish.jimmer.sql.ast.table.Props; import org.babyfish.jimmer.sql.event.EntityEvent; import java.util.SortedMap; public interface CacheableFilter
extends Filter
{ SortedMap getParameters(); boolean isAffectedBy(EntityEvent> e); } KCacheableFilter.kt package org.babyfish.jimmer.sql.kt.filter import org.babyfish.jimmer.sql.event.EntityEvent import java.util.* interface KCacheableFilter : KFilter { fun getParameters(): SortedMap? fun isAffectedBy(e: EntityEvent<*>): Boolean } This interface inherits from Filter/KFilter and adds two new methods: getParameters: The sub key fragment contributed by this filter for multi-view cache. isAffectedBy: Accepts an event that the filtered entity is modified, and judges whether the filtering fields depended on by the current filter are changed. info An entity type allows being processed by multiple global filters: If any one of them is cache-unfriendly, it will cause all filter-sensitive properties to become uncacheable. Therefore, these global filters must either all be cache-unfriendly Filter/KFilter, or all be cache-friendly CacheableFilter/KCacheableFilter. Mixing them together makes no sense. If such meaningless mixing occurs accidentally, Jimmer will tell why cache is abandoned. When all global filters are cache-friendly, the data returned by the getParameters() method of all CacheableFilter/KCacheableFilter objects is merged together as the SubKey of the multi-view cache. For example, if an entity is processed by two global filters at the same time. One is the filter implied by logical delete, denoted as a; the other one is a user-defined filter, denoted as b. Assume a's getParameters() returns {\"logicalDeleted\":false} b's getParameters() returns {\"tenant\":\"a\"} Then the final SubKey in multi-view cache will be {\"logicalDeleted\":false,\"tenant\":\"a\"}","s":"Basic Concepts","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#basic-concepts","p":89},{"i":94,"t":"In the User-defined Filters documentation, we defined a super type TenantAware for entities. Let's review its code again: Java Kotlin TenantAware.java @MappedSuperclass public interface TenantAware { String tenant(); } TenantAware.kt @MappedSuperclass interface TenantAware { val tenant: String } Any entity type that needs to support multiple tenants can inherit TenantAware, such as Book: Java Kotlin Book.java @Entity public interface Book extends TenantAware { ...code omitted... } Book.kt @Entity interface Book : TenantAware { ...code omitted... } Assume there is an object of type TenantProvider in the Spring context. Its Java method get() and Kotlin property tenant are used to extract the tenant from the identity information of the current operator. Define the following filter: Java Kotlin @Component public class TenantFilter implements CacheableFilter { private final TenantProvider tenantProvider; public TenantFilter(TenantProvider tenantProvider) { this.tenantProvider = tenantProvider; } @Override public void filter(FilterArgs args) { String tenant = tenantProvider.get(); if (tenant != null) { args.where(args.getTable().tenant().eq(tenant)); } } @Override public SortedMap getParameters() { String tenant = tenantProvider.get(); if (tenant == null) { return null; } SortedMap map = new TreeMap<>(); map.put(\"tenant\", tenant); return map; } @Override public boolean isAffectedBy(EntityEvent> e) { return e.isChanged(TenantAwareProps.TENANT) } } @Component class TenantFilter( private val tenantProvider: TenantProvider ) : KCacheableFilter { override fun filter(args: KFilterArgs) { tenantProvider.tenant?.let { args.apply { where(table.tenant.eq(it)) } } } override fun getParameters(): SortedMap? = tenantProvider.tenant?.let { sortedMapOf(\"tenant\" to it) } override fun isAffectedBy(e: EntityEvent<*>): Boolean = e.isChanged(TenantAware::tenant) }","s":"Define Cache-friendly Filters","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#define-cache-friendly-filters","p":89},{"i":97,"t":"Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new CacheFactory() { @Override public Cache, ?> createObjectCache(@NotNull ImmutableType type) { ...code omitted... } @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { ...code omitted... } @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { return createPropCache( prop == BookStoreProps.BOOKS.unwrap() || prop == AuthorProps.BOOKS.unwrap() prop, Duration.ofMinutes(5), Duration.ofHours(5) ); } @Override public Cache, ?> createResolverCache(ImmutableProp prop) { return createPropCache( prop == BookStoreProps.AVG_PRICE.unwrap() || prop == BookStoreProps.NEWEST_BOOKS.unwrap() prop, Duration.ofMinutes(1), Duration.ofHours(1) ); } private Cache createPropCache( boolean isMultiviewCache, ImmutableProp prop, Duration caffeineDuration, Duration redisDuration ) { if (isMultiView) { return new ChainCacheBuilder() .add( CaffeineHashBinder .forProp(prop) .maximumSize(128) .duration(caffeineDuration) .build() ) .add( RedisHashBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build(); } return new ChainCacheBuilder<>() .add( CaffeineValueBinder .forObject(type) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build(); } }; } @Bean fun cacheFactory( connectionFactory: RedisConnectionFactory, objectMapper: ObjectMapper ): KCacheFactory { return object: KCacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ...code omitted... override fun createAssociatedIdCache(prop: ImmutableProp): Cache<*, *>? = ...code omitted... override fun createAssociatedIdListCache(prop: ImmutableProp): Cache<*, List<*>>? = createPropCache( prop === BookStore::books.toImmutableProp() || prop === Author::books.toImmutableProp(), prop, Duration.ofMinutes(1), Duration.ofHours(1) ) override fun createResolverCache(prop: ImmutableProp): Cache<*, *> = createPropCache( prop === BookStore::avgPrice.toImmutableProp() || prop === BookStore::newestBooks.toImmutableProp(), prop, Duration.ofMinutes(1), Duration.ofHours(1) ) private fun createPropCache( isMultiView: Boolean, prop: ImmutableProp, caffeineDuration: Duration, redisDuration: Duration ): Cache { if (isMultiView) { return ChainCacheBuilder() .add( CaffeineHashBinder .forProp(prop) .maximumSize(128) .duration(caffeineDuration) .build() ) .add( RedisHashBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build(); } ChainCacheBuilder() .add( CaffeineValueBinder .forProp(prop) .maximumSize(512) .duration(caffeineDuration) .build() ) .add( RedisValueBinder .forProp(prop) .redis(connectionFactory) .objectMapper(objectMapper) .duration(redisDuration) .build() ) .build() } } } The RedisHashBinder class in the above code is a very important implementation that utilizes Redis' support for multi-view cache. The underlying storage structure corresponds to Redis Hashes, i.e. nested Hash structures. Cache Style Is Multi-view Abstract API Built-in Impl Cache with self-loading (usually first-level cache technologies like Guava, Caffeine) Single-view LoadingBinder CaffeineValueBinder Multi-view LoadingBinder.Parameterized None Cache without self-loading (usually second-level cache technologies like Redis) Single-view SimpleBinder RedisValueBinder Multi-view SimpleBinder.Parameterized RedisHashBinder RedisHashBinder","s":"Simple Approach","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#simple-approach","p":89},{"i":99,"t":"In the above code, the createAssociatedIdListCache method judges the prop parameter to decide whether to build multi-view cache or single-view cache. However, tip For association properties, whether multi-view cache needs to be built can be determined solely by whether the target entity is filtered. Jimmer provides better support for this. Developers only need to replace the super interface CacheFactory/KCacheFactory with the super class AbstractCacheFactory/AbstractKCacheFactory to inherit a member called getFilterState/filterState which can help us determine whether to build multi-view cache. Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new AbstractCacheFactory() { @Override public Cache, ?> createObjectCache(@NotNull ImmutableType type) { ...code omitted... } @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { return createPropCache( getFilterState().isAffectedBy(prop.getTargetType()), prop, Duration.ofMinutes(5), Duration.ofHours(5) ); } @Override public Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { return createPropCache( getFilterState().isAffectedBy(prop.getTargetType()), prop, Duration.ofMinutes(5), Duration.ofHours(5) ); } @Override public Cache, ?> createResolverCache(ImmutableProp prop) { return createPropCache( prop == BookStoreProps.AVG_PRICE.unwrap() || prop == BookStoreProps.NEWEST_BOOKS.unwrap() prop, Duration.ofSeconds(1), Duration.ofHours(24) ); } private Cache createPropCache( boolean isMultiviewCache, ImmutableProp prop, Duration duration ) { ...code omitted... } }; } @Bean fun cacheFactory( connectionFactory: RedisConnectionFactory, objectMapper: ObjectMapper ): KCacheFactory { return object: AbstractKCacheFactory() { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ...code omitted... override fun createAssociatedIdCache(prop: ImmutableProp): Cache<*, *>? = createPropCache( filterState.isAffectedBy(prop.targetType), prop, Duration.ofMinutes(5), Duration.ofHours(5) ) override fun createAssociatedIdListCache(prop: ImmutableProp): Cache<*, List<*>>? = createPropCache( filterState.isAffectedBy(prop.targetType), prop, Duration.ofMinutes(5), Duration.ofHours(5) ) override fun createResolverCache(prop: ImmutableProp): Cache<*, *> = createPropCache( prop === BookStore::avgPrice.toImmutableProp() || prop === BookStore::newestBooks.toImmutableProp(), prop, Duration.ofHours(1), Duration.ofHours(24) ) private fun createPropCache( isMultiView: Boolean, prop: ImmutableProp, caffeineDuration: Duration, redisDuration: Duration ): Cache { ...code omitted... } } } info Unfortunately, this method can only simplify the construction of association caches, i.e. simplify the createAssociatedIdCache and createAssociatedIdListCache methods. For calculated properties, since the framework is unaware of the internal logic used by user-defined calculated properties, it cannot simplify them. Users need to decide whether to build multi-view caches based on their own business characteristics.","s":"Better Approach","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#better-approach","p":89},{"i":101,"t":"We have defined the getParameters method in TenantFilter. All affected association properties will automatically specify SubKey for their association caches. However, unfortunately, due to the introduction of user-defined calculation rules that the framework cannot understand, developers must manually specify SubKey for the TransientResolver implementation of calculated properties. Java Kotlin BookStoreAvgPriceResolver.java @Component public class BookStoreAvgPriceResolver implements TransientResolver { private final JSqlClient sqlClient; @Override public Ref> getParameterMapRef() { return sqlClient .getFilters() .getTargetParameterMapRef(BookStoreProps.BOOKS); } ...code omitted... } BookStoreAvgPriceResolver.kt @Component class BookStoreAvgPriceResolver( private val sqlClient: KSqlClient ) : KTransientResolver { override fun getParameterMapRef(): Ref?>? { return sqlClient .filters .getTargetParameterMapRef(BookStore::books) } ...code omitted... } Obviously, the calculated property BookStore.avgPrice is actually determined by the association property BookStore.books and changes with it. Therefore, whatever SubKey the association property BookStore.books specifies for the multi-view cache system in the current invocation context, the calculated property BookStore.avgPrice should specify the same one. note BookStore.avgPrice is also affected by Book.price. It changes when Book.price changes. However, Book.price is a non-associative property of the object, so it must be irrelevant to the multi-view cache system. The getParameterMapRef method does not need to consider it here.","s":"SubKey of Calculated Properties","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#subkey-of-calculated-properties","p":89},{"i":103,"t":"Now that we have made the association property BookStore.books and the calculated property BookStore.avgPrice support multi-view caching, let's use object fetchers to query them: Java Kotlin BookStoreTable table = Tables.BOOK_STORE_TABLE; List stores = sqlClient .createQuery(table) .select( table.fetch( Fetchers.BOOK_STORE_FETCHER .allScalarFields() .books( ❶ Fetchers.BOOK_FETCHER .allScalarFields() ) .avgPrice() ❷ ) ) .execute(); System.out.println(stores); val stores = sqlClient .createQuery(BookStore::class) { select( table.fetchBy { allScalarFields() books { ❶ allScalarFields() } avgPrice() ❷ } ) } .execute() println(stores)","s":"Usage","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#usage","p":89},{"i":105,"t":"Assume the current tenant name is a, the execution process is as follows: First step: Query aggregate root First query the aggregate root object by executing the following SQL: select tb_1_.ID, tb_1_.NAME, tb_1_.WEBSITE from BOOK_STORE tb_1_ Here the query in the code is implemented to get some BookStore objects. Such objects directly queried by the user are called aggregate root objects. Second step: Query BookStore.books in ❶ through association cache The above code will get a series of aggregate root objects. If using the official example data, it will get two aggregate root objects with ID of 1 and 2 for BOOK_STORE. Jimmer first looks up the data from Redis. The keys looked up are BookStore.books-1 and BookStore.books-2. Assume the data for these keys cannot be found in Redis: 127.0.0.1:6379> keys BookStore.books-* (empty array) So the following SQL is executed to complete the associated property BookStore.books: SQL: select, tb_1_.STORE_ID, tb_1_.ID from BOOK tb_1_ where tb_1_.STORE_ID in ( ? /* 1 */, ? /* 2 */ ) and // highlight-next-line tb_1_.TENANT = ? /* a */ order by tb_1_.NAME asc, tb_1_.EDITION desc info The filter condition tb_1_.TENANT = 'a' comes from the user filter TenantFilter. Jimmer will put the query result into Redis. So we can view the data from Redis: 127.0.0.1:6379> keys BookStore.books-* 1) \"BookStore.books-2\" 2) \"BookStore.books-1\" 127.0.0.1:6379> hgetall BookStore.books-1 1) \"{\\\"tenant\\\":\\\"a\\\"}\" 2) \"[5,3,1,9,7]\" 127.0.0.1:6379> hgetall BookStore.books-2 1) \"{\\\"tenant\\\":\\\"a\\\"}\" 2) \"[11]\" info Jimmer uses Redis Hash for multi-perspective cache. So hgetall instead of get is needed. Redis Hash is a nested KV structure: The outer Redis Key, e.g. BookStore.books-1 and BookStore.books-2, is no different from single-perspective cache. The inner Hash Key, also called SubKey in Jimmer, is provided by global filters. Here, {\"tenant\":\"a\"} is provided by TenantProvider, indicating the cached value is not the id set of all associated objects, but the id set of associated objects visible to tenant a. tip Undoubtedly, executing the above Java/Kotlin code again with the same tenant identity before data expiration in Redis, it will directly return associated data from Redis without generating related SQL. Third step: Convert id set to associated objects In the previous step we got the id set of associated objects corresponding to associated property BookStore.books, representing the associated objects visible to tenant a. Now we can use the object cache of Book to convert the Book id set into Book object set. This step is very simple without further discussion. Fourth step: Query BookStore.avgPrice in ❷ through computation cache The above code will get a series of aggregate root objects. If using the official example data, it will get two aggregate root objects with ID of 1 and 2 for BOOK_STORE. Jimmer first looks up the data from Redis. The keys looked up are BookStore.avgPrice-1 and BookStore.avgPrice-2. Assume the data for these keys cannot be found in Redis: 127.0.0.1:6379> keys BookStore.avgPrice-* (empty array) So the following SQL is executed to compute the calculation property: select tb_1_.ID, avg(tb_2_.PRICE) from BOOK_STORE tb_1_ left join BOOK tb_2_ on tb_1_.ID = tb_2_.STORE_ID where tb_1_.ID in ( ? /* 1 */, ? /* 2 */ ) and // highlight-next-line tb_1_.TENANT = ? /* a */ group by tb_1_.ID info The filter condition tb_1_.TENANT = 'a' comes from the user filter TenantFilter. Jimmer will put the query result into Redis. So we can view the data from Redis: 127.0.0.1:6379> keys BookStore.avgPrice-* 1) \"BookStore.avgPrice-2\" 2) \"BookStore.avgPrice-1\" 127.0.0.1:6379> hgetall BookStore.avgPrice-1 1) \"{\\\"tenant\\\":\\\"a\\\"}\" 2) \"53.1\" 127.0.0.1:6379> hgetall BookStore.avgPrice-2 1) \"{\\\"tenant\\\":\\\"a\\\"}\" 2) \"81\" info Jimmer uses Redis Hash for multi-perspective cache. So hgetall instead of get is needed. Redis Hash is a nested KV structure: The outer Redis Key, e.g. BookStore.avgPrice-1 and BookStore.avgPrice-2, is no different from single-perspective cache. The inner Hash Key, also called SubKey in Jimmer, is provided by global filters. Here, {\"tenant\": \"a\"} is provided by TenantProvider, indicating the cached value is not the average price of all associated objects, but the average price of associated objects visible to tenant a. tip Undoubtedly, executing the above Java/Kotlin code again with the same tenant identity before data expiration in Redis, it will directly return associated data from Redis without generating related SQL. Finally, Jimmer concatenates the results of the 4 steps and returns them to the user. [ { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"books\":[ { \"id\":11, \"name\":\"GraphQL in Action\", \"edition\":2, \"price\":81 } ], \"avgPrice\":81 }, { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"books\":[ { \"id\":5, \"name\":\"Effective TypeScript\", \"edition\":2, \"price\":69 }, { \"id\":3, ...omitted... }, { \"id\":1, ...omitted... }, { \"id\":9, ...omitted... }, { \"id\":7, ...omitted... } ], \"avgPrice\":53.1 } ]","s":"Execute with one tenant identity","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#execute-with-one-tenant-identity","p":89},{"i":107,"t":"The query execution process with tenant a has been discussed. Similarly, we can execute multiple times using different tenant identities to leave cache data in Redis from the following perspectives: tenant = null tenant = \"a\" tenant = \"b\" info For the official example, TenantProvider is implemented based on HTTP request header and has swagger UI support. It's easy to execute three times with three different user identities. Among them, tenant = null corresponds to the unauthorized/logout state in swagger UI. Open redis-cli, we can verify the data in Redis: 127.0.0.1:6379> keys BookStore.books-* 1) \"BookStore.books-2\" 2) \"BookStore.books-1\" 127.0.0.1:6379> hgetall BookStore.books-1 1) \"{\\\"tenant\\\":\\\"b\\\"}\" 2) \"[6,4,2,8]\" 3) \"{\\\"tenant\\\":\\\"a\\\"}\" 4) \"[5,3,1,9,7]\" 5) \"{}\" 6) \"[6,5,4,3,2,1,9,8,7]\" 127.0.0.1:6379> hgetall BookStore.books-2 1) \"{\\\"tenant\\\":\\\"b\\\"}\" 2) \"[12,10]\" 3) \"{\\\"tenant\\\":\\\"a\\\"}\" 4) \"[11]\" 5) \"{}\" 6) \"[12,11,10]\" 127.0.0.1:6379> keys BookStore.avgPrice-* 1) \"BookStore.avgPrice-2\" 2) \"BookStore.avgPrice-1\" 127.0.0.1:6379> hgetall BookStore.avgPrice-1 1) \"{\\\"tenant\\\":\\\"b\\\"}\" 2) \"65.25\" 3) \"{\\\"tenant\\\":\\\"a\\\"}\" 4) \"53.1\" 5) \"{}\" 6) \"58.500000\" 127.0.0.1:6379> hgetall BookStore.avgPrice-2 1) \"{\\\"tenant\\\":\\\"b\\\"}\" 2) \"80\" 3) \"{\\\"tenant\\\":\\\"a\\\"}\" 4) \"81\" 5) \"{}\" 6) \"80.333333\" tip Readers can take a close look at these redis-cli commands and easily find that the data of sub key {\"tenant\":\"a\"} merged with the data of sub key {\"tenant\":\"b\"} is exactly the data of SubKey {}. The data returned to the user in the 3 calls is: tenant=null tenant=a tenant=b [ { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"books\":[ { \"id\":12, \"name\":\"GraphQL in Action\", \"edition\":3, \"price\":80, }, { \"id\":11, ...omitted... }, { \"id\":10, ...omitted... } ], \"avgPrice\":80.333333 }, { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"books\":[ { \"id\":6, \"name\":\"Effective TypeScript\", \"edition\":3, \"price\":88 }, { \"id\":5, ...omitted... }, { \"id\":4, ...omitted... }, { \"id\":3, \"name\":\"Learning GraphQL\", \"edition\":3, \"price\":51 }, { \"id\":2, ...omitted... }, { \"id\":1, ...omitted... }, { \"id\":9, \"name\":\"Programming TypeScript\", \"edition\":3, \"price\":48 }, { \"id\":8, ...omitted... }, { \"id\":7, ...omitted... } ], \"avgPrice\":58.5 } ] [ { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"books\":[ { \"id\":11, \"name\":\"GraphQL in Action\", \"edition\":2, \"price\":81 } ], \"avgPrice\":81 }, { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"books\":[ { \"id\":5, \"name\":\"Effective TypeScript\", \"edition\":2, \"price\":69 }, { \"id\":3, ...omitted... }, { \"id\":1, ...omitted... }, { \"id\":9, ...omitted... }, { \"id\":7, ...omitted... } ], \"avgPrice\":53.1 } ] [ { \"id\":2, \"name\":\"MANNING\", \"website\":null, \"books\":[ { \"id\":12, \"name\":\"GraphQL in Action\", \"edition\":3, \"price\":80 }, { \"id\":10, ...omitted... } ], \"avgPrice\":80 }, { \"id\":1, \"name\":\"O'REILLY\", \"website\":null, \"books\":[ { \"id\":6, \"name\":\"Effective TypeScript\", \"edition\":3, \"price\":88 }, { \"id\":4, ...omitted... }, { \"id\":2, ...omitted... }, { \"id\":8, ...omitted... } ], \"avgPrice\":65.25 } ]","s":"Execute repeatedly with multiple tenant identities","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#execute-repeatedly-with-multiple-tenant-identities","p":89},{"i":109,"t":"Now let's modify the property Book.tenant of the Book object with id 6 from \"b\" to \"a\". Since Book-6 belongs to BookStore-1, it is foreseeable that the multi-view caches corresponding to the properties BookStore.books-1 and BookStore.avgPrice-1 will definitely be invalidated. If BinLog trigger is enabled, modifying the database in any way can lead to Jimmer's cache consistency involvement. For example, directly executing the following SQL in SQL IDE: update BOOK set TENANT = 'a' where ID = 6; If only Transaction trigger is enabled, the database must be modified using Jimmer's API: Java Kotlin sqlClient.save( Immutables.createBook(draft -> { draft.setId(6L); draft.setTenant(\"a\"); }) ); sqlClient.save( Book { id = 6L tenant = \"a\" } ) No matter which way above is used to modify the data, you will see the following log output: Delete data from redis: [Book-6] ❶ Delete data from redis: [Author.books-3] ❷ Delete data from redis: [BookStore.books-1] ❸ Delete data from redis: [BookStore.avgPrice-1] ❹ ❶ Update object cache of modified entity ❷ Any association property targeting Book must be affected, of course including Author.books According to existing database data, the affected Author object id is 3 ❸ Any association property targeting Book must be affected, of course including BookStore.books According to existing database data, the affected BookStore object id is 1 ❹ The calculated cache BookStore.avgPrice of BookStore object with id 1 is also affected. This is the most amazing characteristic. Although the framework is unaware of the calculation rule used by users in calculated properties, in the Calculated Cache documentation, we discussed the following code in the BookStoreAvgPriceResolver class: Java Kotlin @EventListener public void onAssociationChange(AssociationEvent e) { if (sqlClient.getCaches().isAffectedBy(e) && e.isChanged(BookStoreProps.BOOKS) ) { ...code omitted... } } @EventListener fun onAssociationChange(e: AssociationEvent) { if (sqlClient.caches.isAffectedBy(e) && e.isChanged(BookStore::books) ) { ...code omitted... } } If you have forgotten the specific logic of this code, you can review the Calculated Cache documentation. Just focus on the highlighted line. Here, this calculated property cares about changes to the association property BookStore.books. tip Modifying the association field between tables is not the only way to trigger association change events. Modifying the filtered field in associated objects that affects global filters, like TENANT here, can also trigger association change events. This is a very important characteristic of Jimmer's trigger mechanism! It is obvious that ❸ has already sensed the change of association property BookStore.books, so it will further lead to the invalidation of the calculated cache here.","s":"Cache Invalidation","u":"/jimmer-doc/docs/cache/multiview-cache/user-filter","h":"#cache-invalidation","p":89},{"i":112,"t":"To enable cache, you first need to implement the CacheFactory/KCacheFactory interface, which is defined as follows: Java Kotlin CacheFactory.java package org.babyfish.jimmer.sql.cache; import org.babyfish.jimmer.meta.ImmutableProp; import org.babyfish.jimmer.meta.ImmutableType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.List; public interface CacheFactory { @Nullable default Cache, ?> createObjectCache(@NotNull ImmutableType type) { return null; } @Nullable default Cache, ?> createAssociatedIdCache(@NotNull ImmutableProp prop) { return null; } @Nullable default Cache, List>> createAssociatedIdListCache(@NotNull ImmutableProp prop) { return null; } @Nullable default Cache, ?> createResolverCache(@NotNull ImmutableProp prop) { return null; } } KCacheFactory.kt package org.babyfish.jimmer.sql.kt.cache import org.babyfish.jimmer.meta.ImmutableProp import org.babyfish.jimmer.sql.cache.Cache import org.babyfish.jimmer.sql.cache.CacheFactory interface KCacheFactory : CacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = null override fun createAssociatedIdCache(prop: ImmutableProp): Cache<*, *>? = null override fun createAssociatedIdListCache(prop: ImmutableProp): Cache<*, List<*>>? = null override fun createResolverCache(prop: ImmutableProp): Cache<*, *>? = null } info For Kotlin, in order to generate better code when overriding createAssociatedIdListCache, please implement the org.babyfish.jimmer.sql.kt.cache.KCacheFactory interface. Otherwise, the return type of the override method generated by the IDE will be Cache<*, MutableList<*>> instead of the expected Cache<*, List<*>>. Jimmer calls this interface to initialize caches for types and properties. Users implement this interface to answer: createObjectCache: Enable object cache The parameter specifies an entity type. If you want to enable object cache for it, create and return the cache; otherwise, return null. Object cache refers to mapping id to entity object. info This entity object is orphaned, without associated properties. One-to-one/many-to-one associations based on foreign keys are an exception, they can hold associated objects with only the id property, because the id of the associated object is actually the foreign key field of the current table. createAssociatedIdCache and createAssociatedIdListCache: Enable association cache Both createAssociatedIdCache and createAssociatedIdListCache are used to enable association cache. The only difference between them is: createAssociatedIdCache: For one-to-one or many-to-one associations. createAssociatedIdListCache: For one-to-many or many-to-many associations. The parameter specifies an association property. If you want to enable association cache for it, create and return the cache; otherwise return null. Association cache refers to mapping id to associated id or associated id collection. createResolverCache: Enable calculated cache The parameter specifies a complex calculated property. If you want to enable calculated cache for it, create and return the cache; otherwise, return null. Computed cache refers to mapping id to calculated result.","s":"CacheFactory Interface","u":"/jimmer-doc/docs/cache/enable-cache","h":"#cachefactory-interface","p":110},{"i":114,"t":"The return type of all methods of the CacheFactory interface is org.babyfish.jimmer.sql.cache.Cache. Users do not need to directly implement Cache, but need to use org.babyfish.jimmer.sql.cache.chain.ChainCacheBuilder to build multi-level caches. In theory, ChainCacheBuilder supports caches of any number of levels. However, in most projects, two levels of cache are sufficient, for example: Java Kotlin return new CacheFactory() { @Override @Nullable public Cache, ?> createObjectCache(@NotNull ImmutableType type) { return new ChainCacheBuilder<>() .add( ❶ CaffeineValueBinder .forObject(type) .maximumSize(512) .duration(Duration.ofSeconds(10)) .build() ) .add( ❷ RedisValueBinder .forObject(type) .redis(connectionFactory) .objectMapper(objectMapper) .duration(Duration.ofHours(10)) .build() ) ) .build(); } }; return object: KCacheFactory { override fun createObjectCache(type: ImmutableType): Cache<*, *>? = ChainCacheBuilder() .add( ❶ CaffeineValueBinder .forObject(type) .maximumSize(512) .duration(Duration.ofSeconds(10)) .build() ) .add( ❷ RedisValueBinder .forObject(type) .redis(connectionFactory) .objectMapper(objectMapper) .duration(Duration.ofHours(10)) .build() ) ) .build() } ❶ Indicates first level cache based on Caffeine in-process JVM cache. ❷ Indicates second level cache based on Redis remote cache. As we can see, ChainCacheBuilder uses chain programming style. Calling the add method multiple times can build multi-level caches. The ChainCacheBuilder.add method is defined as follows: public class ChainCacheBuilder { public ChainCacheBuilder add(LoadingBinder binder) { ❶ ...omit code... return this; } public ChainCacheBuilder add(LoadingBinder.Parameterized binder) { ❷ ...omit code... return this; } public ChainCacheBuilder add(SimpleBinder binder) { ❸ ...omit code... return this; } ...omit other code... } ❶ org.babyfish.jimmer.sql.cache.chain.LoadingBinder is an interface. Any cache technology that automatically loads values on first access to a key can be adapted through this interface. Almost all in-process JVM caches have automatic loading capabilities, such as Caffeine or Guava Cache used in the above code. ❷ The code is only used by multi-view caches. Readers can ignore it for now. ❸ org.babyfish.jimmer.sql.cache.chain.SimpleBinder is an interface. Any cache technology without automatic value loading behavior can be adapted through this interface. Almost all remote caches do not have automatic loading capabilities, such as Redis used in the above code. tip Any cache technology can be adapted to the abstract interfaces LoadingBinder or SimpleBinder. Therefore, in Jimmer's multi-level cache architecture, no assumptions or restrictions are made on the choice of cache technology at any level. If using Jimmer's SpringBoot Starter, you can use the following three cache technology adapter classes, as in the code above: Jimmer's built-in adapter classes Implemented Interface Supports Multi-view Cache org.babyfish.jimmer.spring.cache.CaffeineBinder org.babyfish.jimmer.sql.cache.chain.LoadingBinder No org.babyfish.jimmer.spring.cache.RedisValueBinder org.babyfish.jimmer.sql.cache.chain.SimpleBinder No org.babyfish.jimmer.spring.cache.RedisHashBinder org.babyfish.jimmer.sql.cache.chain.SimpleBinder.Parameterized Yes note Multi-view caches will be explained in a subsequent article. Please ignore them for now.","s":"Multi-level Cache Architecture","u":"/jimmer-doc/docs/cache/enable-cache","h":"#multi-level-cache-architecture","p":110},{"i":116,"t":"Now we have introduced the CacheFactory interface and multi-level cache architecture, but there is one last step to enable cache. The last step is to register CacheFactory for Jimmer.","s":"Configuring CacheFactory","u":"/jimmer-doc/docs/cache/enable-cache","h":"#configuring-cachefactory","p":110},{"i":118,"t":"If using SpringBoot Starter, just let CacheFactory be managed by Spring. Java Kotlin @Bean public CacheFactory cacheFactory() { return new CacheFactory() { ...omit code... }; } @Bean fun cacheFactory(): KCacheFactory = object: KCacheFactory { ...omit code... }","s":"SpringBoot Configuration","u":"/jimmer-doc/docs/cache/enable-cache","h":"#springboot-configuration","p":110},{"i":120,"t":"Java Kotlin JSqlClient sqlClient = JSqlClient .newBuilder() .setCacheFactory( new CacheFactory() { ...omit code... } ) ...omit other configuration... .build(); val sqlClient = newKSqlClient { setCacheFactory( object: KCacheFactory { ...omit code... } ) ...omit other configuration... }","s":"Underlying API Configuration","u":"/jimmer-doc/docs/cache/enable-cache","h":"#underlying-api-configuration","p":110},{"i":122,"t":"Earlier we mentioned that if using Jimmer's SpringBoot Starter, you can use the ready-made org.babyfish.jimmer.spring.cache.RedisValueBinder without having to adapt Redis yourself. note RedisHashBinder is related to multi-view caches and will not be discussed in this article. To build RedisValueBinder, you need a RedisOperations. Jimmer's SpringBoot Stater provides the org.babyfish.jimmer.spring.cache.RedisCaches class whose static method RedisCaches.cacheRedisTemplate can quickly build this RedisOperations object. An example of the helper method RedisCaches.cacheRedisTemplate is as follows: Java Kotlin @Bean public CacheFactory cacheFactory( RedisConnectionFactory connectionFactory, ObjectMapper objectMapper ) { return new CacheFactory() { @Override @Nullable public Cache, ?> createObjectCache(@NotNull ImmutableType type) { return new ChainCacheBuilder