[{"data":1,"prerenderedAt":519},["ShallowReactive",2],{"navigation_docs":3,"-apps-persistence-named-queries":196,"-apps-persistence-named-queries-surround":514},[4,127,166],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":36},"Kinotic Apps","i-lucide-rocket","\u002Fapps","1.apps",[10,14,18,37,58,91,106,122],{"title":11,"path":12,"stem":13},"Introduction","\u002Fapps\u002Fintroduction","1.apps\u002F1.introduction",{"title":15,"path":16,"stem":17},"Quick Start","\u002Fapps\u002Fquick-start","1.apps\u002F2.quick-start",{"title":19,"icon":20,"path":21,"stem":22,"children":23,"page":36},"Application Structure","i-lucide-folder-tree","\u002Fapps\u002Fapplication-structure","1.apps\u002F3.application-structure",[24,28,32],{"title":25,"path":26,"stem":27},"Overview","\u002Fapps\u002Fapplication-structure\u002Foverview","1.apps\u002F3.application-structure\u002F1.overview",{"title":29,"path":30,"stem":31},"Applications and Projects","\u002Fapps\u002Fapplication-structure\u002Fapplications-and-projects","1.apps\u002F3.application-structure\u002F2.applications-and-projects",{"title":33,"path":34,"stem":35},"Artifact Types","\u002Fapps\u002Fapplication-structure\u002Fartifact-types","1.apps\u002F3.application-structure\u002F3.artifact-types",false,{"title":38,"icon":39,"path":40,"stem":41,"children":42,"page":36},"Services","i-lucide-network","\u002Fapps\u002Fservices","1.apps\u002F4.services",[43,46,50,54],{"title":25,"path":44,"stem":45},"\u002Fapps\u002Fservices\u002Foverview","1.apps\u002F4.services\u002F1.overview",{"title":47,"path":48,"stem":49},"Publishing Services","\u002Fapps\u002Fservices\u002Fpublishing-services","1.apps\u002F4.services\u002F2.publishing-services",{"title":51,"path":52,"stem":53},"Service Proxies","\u002Fapps\u002Fservices\u002Fservice-proxies","1.apps\u002F4.services\u002F3.service-proxies",{"title":55,"path":56,"stem":57},"Streaming","\u002Fapps\u002Fservices\u002Fstreaming","1.apps\u002F4.services\u002F4.streaming",{"title":59,"icon":60,"path":61,"stem":62,"children":63,"page":36},"Persistence","i-lucide-database","\u002Fapps\u002Fpersistence","1.apps\u002F5.persistence",[64,67,71,75,79,83,87],{"title":25,"path":65,"stem":66},"\u002Fapps\u002Fpersistence\u002Foverview","1.apps\u002F5.persistence\u002F1.overview",{"title":68,"path":69,"stem":70},"Defining Entities","\u002Fapps\u002Fpersistence\u002Fdefining-entities","1.apps\u002F5.persistence\u002F2.defining-entities",{"title":72,"path":73,"stem":74},"Entity Decorators","\u002Fapps\u002Fpersistence\u002Fentity-decorators","1.apps\u002F5.persistence\u002F3.entity-decorators",{"title":76,"path":77,"stem":78},"CRUD Operations","\u002Fapps\u002Fpersistence\u002Fcrud-operations","1.apps\u002F5.persistence\u002F4.crud-operations",{"title":80,"path":81,"stem":82},"Named Queries","\u002Fapps\u002Fpersistence\u002Fnamed-queries","1.apps\u002F5.persistence\u002F5.named-queries",{"title":84,"path":85,"stem":86},"Multi-Tenancy","\u002Fapps\u002Fpersistence\u002Fmulti-tenancy","1.apps\u002F5.persistence\u002F6.multi-tenancy",{"title":88,"path":89,"stem":90},"Migrations","\u002Fapps\u002Fpersistence\u002Fmigrations","1.apps\u002F5.persistence\u002F7.migrations",{"title":92,"icon":93,"path":94,"stem":95,"children":96,"page":36},"Security","i-lucide-shield-check","\u002Fapps\u002Fsecurity","1.apps\u002F6.security",[97,101],{"title":98,"path":99,"stem":100,"icon":93},"Access Control","\u002Fapps\u002Fsecurity\u002Faccess-control","1.apps\u002F6.security\u002F1.access-control",{"title":102,"path":103,"stem":104,"icon":105},"Authentication","\u002Fapps\u002Fsecurity\u002Fauthentication","1.apps\u002F6.security\u002F2.authentication","i-lucide-key-round",{"title":107,"icon":108,"path":109,"stem":110,"children":111,"page":36},"Deployment","i-lucide-cloud-upload","\u002Fapps\u002Fdeployment","1.apps\u002F7.deployment",[112,117],{"title":113,"path":114,"stem":115,"icon":116},"Deployment Workflow","\u002Fapps\u002Fdeployment\u002Fworkflow","1.apps\u002F7.deployment\u002F1.workflow","i-lucide-git-branch",{"title":118,"path":119,"stem":120,"icon":121},"Environments","\u002Fapps\u002Fdeployment\u002Fenvironments","1.apps\u002F7.deployment\u002F2.environments","i-lucide-server",{"title":123,"path":124,"stem":125,"icon":126},"CLI Reference","\u002Fapps\u002Fcli-reference","1.apps\u002F8.cli-reference","i-lucide-terminal",{"title":128,"icon":121,"path":129,"stem":130,"children":131,"page":36},"Kinotic OS","\u002Fplatform","2.platform",[132,137,141,146,151,156,161],{"title":133,"path":134,"stem":135,"icon":136},"System Architecture","\u002Fplatform\u002Farchitecture","2.platform\u002F1.architecture","i-lucide-boxes",{"title":138,"path":139,"stem":140,"icon":6},"Deployment Guide","\u002Fplatform\u002Fdeployment-guide","2.platform\u002F2.deployment-guide",{"title":142,"path":143,"stem":144,"icon":145},"Configuration","\u002Fplatform\u002Fconfiguration","2.platform\u002F3.configuration","i-lucide-settings",{"title":147,"path":148,"stem":149,"icon":150},"Organization Management","\u002Fplatform\u002Forganization-management","2.platform\u002F4.organization-management","i-lucide-building-2",{"title":152,"path":153,"stem":154,"icon":155},"System Security","\u002Fplatform\u002Fsystem-security","2.platform\u002F5.system-security","i-lucide-shield",{"title":157,"path":158,"stem":159,"icon":160},"Observability","\u002Fplatform\u002Fobservability","2.platform\u002F6.observability","i-lucide-activity",{"title":162,"path":163,"stem":164,"icon":165},"Contributing","\u002Fplatform\u002Fcontributing","2.platform\u002F7.contributing","i-lucide-git-pull-request",{"title":167,"icon":168,"path":169,"stem":170,"children":171,"page":36},"Reference","i-lucide-book-open","\u002Freference","3.reference",[172,177,181,186,191],{"title":173,"path":174,"stem":175,"icon":176},"Decorators Reference","\u002Freference\u002Fdecorators","3.reference\u002F1.decorators","i-lucide-at-sign",{"title":178,"path":179,"stem":180,"icon":60},"Migration SQL Grammar","\u002Freference\u002Fmigration-sql-grammar","3.reference\u002F2.migration-sql-grammar",{"title":182,"path":183,"stem":184,"icon":185},"ABAC Expression Language","\u002Freference\u002Fabac-expression-language","3.reference\u002F3.abac-expression-language","i-lucide-file-code",{"title":187,"path":188,"stem":189,"icon":190},"CRI Format","\u002Freference\u002Fcri-format","3.reference\u002F4.cri-format","i-lucide-link",{"title":192,"path":193,"stem":194,"icon":195},"SDK Packages","\u002Freference\u002Fsdk-packages","3.reference\u002F5.sdk-packages","i-lucide-package",{"id":197,"title":80,"body":198,"description":508,"extension":509,"links":510,"meta":511,"navigation":311,"path":81,"seo":512,"stem":82,"__hash__":513},"docs\u002F1.apps\u002F5.persistence\u002F5.named-queries.md",{"type":199,"value":200,"toc":503},"minimark",[201,210,218,223,250,254,264,480,486,489,493,499],[202,203,204,205,209],"p",{},"Named queries let you define custom query methods on your repositories. You declare methods with the ",[206,207,208],"code",{},"@Query"," decorator using a SQL-like syntax, sync them with the server, and the CLI generates the implementation.",[202,211,212,213,217],{},"Currently named queries support ",[214,215,216],"strong",{},"aggregate queries"," (COUNT, SUM, AVG, MIN, MAX, etc.). Support for SELECT, UPDATE, and DELETE queries is coming soon.",[219,220,222],"h2",{"id":221},"workflow","Workflow",[224,225,226,234,240],"ol",{},[227,228,229,230,233],"li",{},"Run ",[206,231,232],{},"kinotic sync"," to sync your entities and generate the base repository classes",[227,235,236,237,239],{},"Add custom methods with the ",[206,238,208],{}," decorator to the generated repository class",[227,241,229,242,245,246,249],{},[206,243,244],{},"kinotic generate"," to regenerate the repository with your query implementations (",[206,247,248],{},"generate"," runs locally without syncing to the server)",[219,251,253],{"id":252},"defining-named-queries","Defining Named Queries",[202,255,256,257,259,260,263],{},"Add methods with the ",[206,258,208],{}," decorator to your repository class. Use ",[206,261,262],{},":paramName"," syntax for parameter binding.",[265,266,271],"pre",{"className":267,"code":268,"language":269,"meta":270,"style":270},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { Query } from '@kinotic-ai\u002Fpersistence'\n\nexport class OrderRepository extends BaseOrderRepository {\n\n    @Query('SELECT COUNT(*) FROM Order WHERE status = :status')\n    countByStatus(status: string): Promise\u003Cnumber> {\n        \u002F\u002F Implementation is generated by the CLI\n    }\n\n    @Query('SELECT SUM(amount) FROM Order WHERE customerId = :customerId')\n    totalSpentByCustomer(customerId: string): Promise\u003Cnumber> {\n        \u002F\u002F Implementation is generated by the CLI\n    }\n}\n","typescript","",[206,272,273,306,313,336,341,365,401,408,414,419,437,464,469,474],{"__ignoreMap":270},[274,275,278,282,286,290,293,296,299,303],"span",{"class":276,"line":277},"line",1,[274,279,281],{"class":280},"s7zQu","import",[274,283,285],{"class":284},"sMK4o"," {",[274,287,289],{"class":288},"sTEyZ"," Query",[274,291,292],{"class":284}," }",[274,294,295],{"class":280}," from",[274,297,298],{"class":284}," '",[274,300,302],{"class":301},"sfazB","@kinotic-ai\u002Fpersistence",[274,304,305],{"class":284},"'\n",[274,307,309],{"class":276,"line":308},2,[274,310,312],{"emptyLinePlaceholder":311},true,"\n",[274,314,316,319,323,327,330,333],{"class":276,"line":315},3,[274,317,318],{"class":280},"export",[274,320,322],{"class":321},"spNyl"," class",[274,324,326],{"class":325},"sBMFI"," OrderRepository",[274,328,329],{"class":321}," extends",[274,331,332],{"class":325}," BaseOrderRepository",[274,334,335],{"class":284}," {\n",[274,337,339],{"class":276,"line":338},4,[274,340,312],{"emptyLinePlaceholder":311},[274,342,344,347,351,354,357,360,362],{"class":276,"line":343},5,[274,345,346],{"class":284},"    @",[274,348,350],{"class":349},"s2Zo4","Query",[274,352,353],{"class":288},"(",[274,355,356],{"class":284},"'",[274,358,359],{"class":301},"SELECT COUNT(*) FROM Order WHERE status = :status",[274,361,356],{"class":284},[274,363,364],{"class":288},")\n",[274,366,368,372,374,378,381,384,387,390,393,396,399],{"class":276,"line":367},6,[274,369,371],{"class":370},"swJcz","    countByStatus",[274,373,353],{"class":284},[274,375,377],{"class":376},"sHdIc","status",[274,379,380],{"class":284},":",[274,382,383],{"class":325}," string",[274,385,386],{"class":284},"):",[274,388,389],{"class":325}," Promise",[274,391,392],{"class":284},"\u003C",[274,394,395],{"class":325},"number",[274,397,398],{"class":284},">",[274,400,335],{"class":284},[274,402,404],{"class":276,"line":403},7,[274,405,407],{"class":406},"sHwdD","        \u002F\u002F Implementation is generated by the CLI\n",[274,409,411],{"class":276,"line":410},8,[274,412,413],{"class":284},"    }\n",[274,415,417],{"class":276,"line":416},9,[274,418,312],{"emptyLinePlaceholder":311},[274,420,422,424,426,428,430,433,435],{"class":276,"line":421},10,[274,423,346],{"class":284},[274,425,350],{"class":349},[274,427,353],{"class":288},[274,429,356],{"class":284},[274,431,432],{"class":301},"SELECT SUM(amount) FROM Order WHERE customerId = :customerId",[274,434,356],{"class":284},[274,436,364],{"class":288},[274,438,440,443,445,448,450,452,454,456,458,460,462],{"class":276,"line":439},11,[274,441,442],{"class":370},"    totalSpentByCustomer",[274,444,353],{"class":284},[274,446,447],{"class":376},"customerId",[274,449,380],{"class":284},[274,451,383],{"class":325},[274,453,386],{"class":284},[274,455,389],{"class":325},[274,457,392],{"class":284},[274,459,395],{"class":325},[274,461,398],{"class":284},[274,463,335],{"class":284},[274,465,467],{"class":276,"line":466},12,[274,468,407],{"class":406},[274,470,472],{"class":276,"line":471},13,[274,473,413],{"class":284},[274,475,477],{"class":276,"line":476},14,[274,478,479],{"class":284},"}\n",[202,481,482,483,485],{},"The method body is left empty because ",[206,484,244],{}," fills in the implementation.",[202,487,488],{},"Named queries must be synced to the server before they can be used. If a query has not been synced, calling it will fail at runtime.",[219,490,492],{"id":491},"query-parameters","Query Parameters",[202,494,495,496,498],{},"Each parameter in the query uses ",[206,497,262],{}," syntax. At runtime, the generated method maps its arguments to the corresponding placeholders.",[500,501,502],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":270,"searchDepth":308,"depth":308,"links":504},[505,506,507],{"id":221,"depth":308,"text":222},{"id":252,"depth":308,"text":253},{"id":491,"depth":308,"text":492},"Defining and using custom named queries on entity services in Kinotic.","md",null,{},{"title":80,"description":508},"80XsVY3LF6KZaTjQ8Zi3DdEV2l8FS3LWQMyZSUVlDjU",[515,517],{"title":76,"path":77,"stem":78,"description":516,"children":-1},"Using generated entity services for create, read, update, delete, search, and count operations in Kinotic.",{"title":84,"path":85,"stem":86,"description":518,"children":-1},"Multi-tenant data isolation in Kinotic with automatic tenant filtering.",1775187765402]