[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4282":3},{"id":4,"name":5,"fullName":6,"owner":5,"repo":5,"description":7,"homepage":8,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":15,"forks30d":15,"starsTrendScore":19,"compositeScore":20,"rankGlobal":9,"rankLanguage":9,"license":21,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":22,"hasPages":22,"topics":24,"createdAt":9,"pushedAt":9,"updatedAt":45,"readmeContent":46,"aiSummary":47,"trendingCount":15,"starSnapshotCount":15,"syncStatus":48,"lastSyncTime":49,"discoverSource":50},4282,"jOOQ","jOOQ\u002FjOOQ","jOOQ is the best way to write SQL in Java","https:\u002F\u002Fwww.jooq.org",null,"Java",6730,1217,150,2130,0,1,5,23,3,40.26,"Other",false,"main",[25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44],"code-generator","database","db2","hibernate","java","jdbc","jdbc-utilities","jooq","jpa","mysql","oracle","orm","postgresql","sql","sql-builder","sql-formatter","sql-query","sql-query-builder","sql-query-formatter","sqlserver","2026-06-12 02:01:01","jOOQ\n====\n\njOOQ is an internal DSL and source code generator, modelling the SQL language as a type safe Java API to help you write better SQL. \n\nIts main features include:\n\n- [The source code generator](https:\u002F\u002Fblog.jooq.org\u002Fwhy-you-should-use-jooq-with-code-generation\u002F)\n- The [DSL API for type safe query construction](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fdsl-api\u002F) and [dynamic SQL](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fdynamic-sql\u002F)\n\nSecondary features include:\n\n- [DAOs](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fdaos\u002F)\n- [Data export](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fexporting\u002F) and [import](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fimporting\u002F)\n- [Data type conversion](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Ffetching\u002Fdata-type-conversion\u002F)\n- [DDL statement support](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fddl-statements\u002F)\n- [DML statement support](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fsql-statements\u002F)\n- [Diagnostics](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fdiagnostics\u002F)\n- [Dialect agnosticism for 30+ RDBMS](https:\u002F\u002Fwww.jooq.org\u002Fdownload\u002F#databases)\n- [Embedded types](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fcode-generation\u002Fcodegen-embeddable-types\u002F)\n- [Formatting and pretty printing](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fqueryparts\u002Fpretty-printing\u002F)\n- [Implicit joins](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fsql-statements\u002Fselect-statement\u002Fimplicit-join\u002F)\n- [Kotlin support](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fkotlin-sql-building\u002F)\n- [Mapping](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Ffetching\u002Frecordmapper\u002F)\n- [Meta data API](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fmeta-data\u002F)\n- [Mocking API for JDBC](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fmocking-connection\u002F)\n- [Model API for use in traversal and replacement](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fmodel-api\u002F)\n- [`MULTISET` and `ROW` nested collections and records](https:\u002F\u002Fblog.jooq.org\u002Fjooq-3-15s-new-multiset-operator-will-change-how-you-think-about-sql\u002F)\n- [Multitenancy](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fdsl-context\u002Fcustom-settings\u002Fsettings-render-mapping\u002F)\n- [Parser (and translator)](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fsql-parser\u002F)\n- [Pattern based transformation](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fqueryparts\u002Fsql-transformation\u002Ftransform-patterns\u002F)\n- [Plain SQL templating](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fplain-sql-templating\u002F)\n- [Policies](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fqueryparts\u002Fpolicies\u002F)\n- [Procedural logic API](https:\u002F\u002Fblog.jooq.org\u002Fvendor-agnostic-dynamic-procedural-logic-with-jooq\u002F)\n- [Reactive support via R2DBC](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Ffetching\u002Freactive-fetching\u002F)\n- [Readonly columns](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fcode-generation\u002Fcodegen-advanced\u002Fcodegen-config-database\u002Fcodegen-database-readonly-columns\u002F)\n- [Scala support](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fscala-sql-building\u002F)\n- [Schema diff](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fschema-diff\u002F)\n- [SQL transformation](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-building\u002Fqueryparts\u002Fsql-transformation\u002F)\n- [SQL translation](https:\u002F\u002Fwww.jooq.org\u002Ftranslate\u002F)\n- [Stored procedure support](https:\u002F\u002Fblog.jooq.org\u002Fthe-best-way-to-call-stored-procedures-from-java-with-jooq\u002F)\n- [Transaction API](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Ftransaction-management\u002F)\n- [UpdatableRecords for simplified CRUD, with opt-in optimistic locking](https:\u002F\u002Fwww.jooq.org\u002Fdoc\u002Flatest\u002Fmanual\u002Fsql-execution\u002Fcrud-with-updatablerecords\u002Fsimple-crud\u002F)\n- And much more\n\nExamples\n========\n\nTypesafe, embedded SQL\n----------------------\n\njOOQ's main feature is typesafe, embedded SQL, allowing for IDE auto completion of SQL syntax...\n\n![image](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002Fa62305d7-c8a7-4a32-aa32-30708f70337d)\n\n... as well as of schema meta data:\n\n![image](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002Fa8e23067-254c-4a03-89b2-82985325ee69)\n\nThis allows for preventing errors of various types, including typos of identifiers:\n\n![image](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002Fd2659a0c-7d45-4851-9455-81ac4bc18485)\n\nOr data type mismatches:\n\n![image](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002F8d230f16-ce82-4de8-88b2-64997451ebfe)\n\n[The examples are from the code generation blog post](https:\u002F\u002Fblog.jooq.org\u002Fwhy-you-should-use-jooq-with-code-generation\u002F).\n\nA more powerful example using nested collections\n------------------------------------------------\n\nFor many more examples, [please have a look at the demo](https:\u002F\u002Fgithub.com\u002FjOOQ\u002Fdemo). A key example showing jOOQ's various strengths is from the [`MULTISET` operator announcement blog post](https:\u002F\u002Fblog.jooq.org\u002Fjooq-3-15s-new-multiset-operator-will-change-how-you-think-about-sql\u002F):\n\nGiven these target DTOs:\n\n```java\nrecord Actor(String firstName, String lastName) {}\nrecord Film(\n  String title,\n  List\u003CActor> actors,\n  List\u003CString> categories\n) {}\n```\n\nYou can now write the following query to fetch films, their nested actors and their nested categorise in a single, type safe query:\n\n```java\nList\u003CFilm> result =\ndsl.select(\n      FILM.TITLE,\n      multiset(\n        select(\n          FILM.actor().FIRST_NAME, \n          FILM.actor().LAST_NAME)\n        .from(FILM.actor())\n      ).as(\"actors\").convertFrom(r -> r.map(mapping(Actor::new))),\n      multiset(\n        select(FILM.category().NAME)\n        .from(FILM.category())\n      ).as(\"categories\").convertFrom(r -> r.map(Record1::value1))\n   )\n   .from(FILM)\n   .orderBy(FILM.TITLE)\n   .fetch(mapping(Film::new));\n```\n\nThe query is completely type safe. Change a column type, name, or the target DTO, and it will stop compiling! Trust only your own eyes:\n\n![multiset](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002F948f8e62-2a93-4152-86d6-42a6eceb7133)\n\nAnd here you see the nested result in action from the logs:\n\n![execute](https:\u002F\u002Fgithub.com\u002FjOOQ\u002FjOOQ\u002Fassets\u002F734593\u002Fba2f2a9f-218c-4ec9-8fb2-c2b8b7df2f4d)\n\nHow does it work? Look at this annotated example:\n\n\n```java\nList\u003CFilm> result =\ndsl.select(\n      FILM.TITLE,\n\n      \u002F\u002F MULTISET is a standard SQL operator that allows for nesting collections\n      \u002F\u002F directly in SQL. It is either\n      \u002F\u002F - supported natively\n      \u002F\u002F - emulated using SQL\u002FJSON or SQL\u002FXML\n      multiset(\n\n        \u002F\u002F Implicit path based joins allow for simpler navigation of foreign\n        \u002F\u002F key relationships.\n        select(\n          FILM.actor().FIRST_NAME, \n          FILM.actor().LAST_NAME)\n\n        \u002F\u002F Implicit correlation to outer queries allows for avoiding repetitive\n        \u002F\u002F writing of predicates.\n        .from(FILM.actor())\n\n      \u002F\u002F Ad-hoc conversion allows for mapping structural Record2\u003CString, String>\n      \u002F\u002F types to your custom DTO using constructor references\n      ).as(\"actors\").convertFrom(r -> r.map(mapping(Actor::new))),\n      multiset(\n        select(FILM.category().NAME)\n        .from(FILM.category())\n      ).as(\"categories\").convertFrom(r -> r.map(Record1::value1))\n   )\n   .from(FILM)\n   .orderBy(FILM.TITLE)\n   .fetch(mapping(Film::new));\n```\n\nThe generated SQL query might look like this, in PostgreSQL:\n\n```sql\nselect\n  film.title,\n  (\n    select coalesce(\n      jsonb_agg(jsonb_build_object(\n        'first_name', t.first_name,\n        'last_name', t.last_name\n      )),\n      jsonb_build_array()\n    )\n    from (\n      select\n        alias_78509018.first_name, \n        alias_78509018.last_name\n      from (\n        film_actor\n          join actor as alias_78509018\n            on film_actor.actor_id = alias_78509018.actor_id\n        )\n      where film_actor.film_id = film.film_id\n    ) as t\n  ) as actors,\n  (\n    select coalesce(\n      jsonb_agg(jsonb_build_object('name', t.name)),\n      jsonb_build_array()\n    )\n    from (\n      select alias_130639425.name\n      from (\n        film_category\n          join category as alias_130639425\n            on film_category.category_id = alias_130639425.category_id\n        )\n      where film_category.film_id = film.film_id\n    ) as t\n  ) as categories\nfrom film\norder by film.title\n```\n\nThis particular example is explained more in detail in the [`MULTISET` operator announcement blog post](https:\u002F\u002Fblog.jooq.org\u002Fjooq-3-15s-new-multiset-operator-will-change-how-you-think-about-sql\u002F). For many more examples, [please have a look at the demo](https:\u002F\u002Fgithub.com\u002FjOOQ\u002Fdemo).\n","jOOQ是一个用于在Java中编写SQL的工具，它通过提供类型安全的API来帮助开发者更高效地构建SQL查询。该项目的核心功能包括源代码生成器和DSL API，支持类型安全的查询构造及动态SQL，同时具备广泛的数据库方言支持（超过30种RDBMS），以及DDL、DML语句的支持等特性。此外，jOOQ还提供了数据导出\u002F导入、数据类型转换、嵌入式类型定义等功能。适用于需要与多种关系型数据库进行交互，并希望提高SQL编写质量和效率的Java后端开发场景。",2,"2026-06-11 02:59:23","top_language"]