jOOQ Changelog

What's new in jOOQ 3.6.2

Jun 24, 2015
  • Bug fixes:
  • #4162 - Malformed record literal when using PostgreSQL array of user-defined types
  • #4248 - daoImplements option in MatcherStrategy not generating an implements statement in DAO class
  • #4258 - Bad SQL generated for quantified row value expression predicates in Oracle
  • #4269 - No columns generated for PostgreSQL SETOF [ scalar type ]
  • #4287 - Remove unused import org.jooq.Row in generated records
  • #4292 - Wrong emulation of "grand total" GROUP BY () clause in dialects that do not natively support them
  • #4300 - DROP SEQUENCE IF EXISTS implemented incorrectly in Sybase SQL Anywhere
  • #4308 - SQLSERVER2014 dialect doesn't generate correct LIMIT .. OFFSET clause
  • #4313 - NullPointerException in code generator when bypassing GenerationTool without initialising all Lists and String[] to empty objects in Database
  • #4314 - SQL Server UPDATE .. FROM illegally declares aliased tables in UPDATE clause
  • #4321 - Invalid SQL generated when using nullable data types for Derby
  • #4324 - DROP SEQUENCE statement has a mandatory RESTRICT keyword in Derby
  • #4328 - Bad implementation of ALTER TABLE .. ALTER COLUMN .. SET DATA TYPE in Derby
  • #4331 - REFERENCES .. ON { DELETE | UPDATE } SET DEFAULT is currently not supported by Derby
  • #4333 - Firebird CREATE TABLE regression when columns are nullable
  • #4341 - No Results are fetched from SQL Server procedures that contain update counts
  • #4344 - MockStatement returns wrong update counts
  • #4349 - The trial / pro license is accidentally delivered with the Open Source Edition

New in jOOQ 3.6.1 (Apr 30, 2015)

  • #4224 - ORA-00904: "SYS"."ALL_PROCEDURES"."OBJECT_ID": invalid identifier when using the code generator with Oracle 10g
  • #4225 - ScalaGenerator logs that it generates XXX.java files
  • #4227 - ScalaGenerator should have its own list of reserved words
  • #4235 - JDBCDatabase calls Meta.getPrimaryKeys() for all schemas, not just for input schemas
  • #4236 - Compilation error in compiled code when column is called "null"
  • #4240 - JDBCDatabase fetches tables from all schemas, not just from input schemas
  • #4246 - HANADataType isn't initialised in SQLDataType's static initialiser block

New in jOOQ 3.6.0 (Apr 25, 2015)

  • We've been working hard to add support for our 18th database dialect: SAP HANA,
  • which is now officially supported by the jOOQ Enterprise Edition. HANA is SAP's
  • excellent Big Data offering, supporting column stores combined with the power of
  • SQL standard OLAP functionality, such as window functions. Integrate HANA into
  • your Java or Scala applications with ease, using jOOQ!
  • LET'S TALK SCALA:
  • We're glad to welcome an increasingly big jOOQ-for-Scala community, an
  • integration where jOOQ really shines thanks to some advanced Scala language
  • features. In order to help you integrate even better, we've now added the new
  • ScalaGenerator that generates jOOQ meta data classes in Scala, instead of Java
  • INTEGRATE YOUR CODE GENERATION WITH JPA OR VERTABELO:
  • In the previous release, we've implemented a new XMLDatabase that can load
  • arbitrary XML schema metadata formats (via XSLT). We've taken this a step
  • further using our new jOOQ-meta-extensions artefact, which hosts alternative
  • meta data sources, such as your JPA-annotated classes, or Vertabelo exports.
  • SPEAKING OF XML:
  • Our XML-in-the-database integration just got better! We're showing you in a
  • couple of example Bindings how to get the most out of your vendor-specific data
  • types, such as XML or JSON - which can be integrated into your jOOQ queries
  • effortlessly!
  • LET'S TALK SOME MORE DDL:
  • This release also adds support for a couple of additional DDL statements that
  • help you standardise your schema migrations for our 18 RDBMS. The newly
  • supported statements are:
  • - ALTER TABLE ADD CONSTRAINT (with UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK)
  • - ALTER TABLE DROP CONSTRAINT
  • - CREATE TEMPORARY TABLE
  • SQL 2 JOOQ PARSER:
  • One year ago, we've added the GUDU Software SQL 2 jOOQ parser with our
  • deliverables. While we still believe that this is an excellent product, we have
  • seen little demand from our users and customers - which is why we no longer ship
  • the parser. You can still download it from GUDU Software.
  • MULTISET AND NESTED RECORDS:
  • While we have published (as promised) some API for nested record support, we're
  • not quite convinced of its design yet. This is why this API is still marked as
  • "experimental". Stay tuned for future releases when we'll take these advanced
  • ORDBMS features one step further.
  • Tons of new convenience API and bugfixes:
  • jOOQ wouldn't be jOOQ if it wasn't for the myriad convenience methods that make
  • your SQL integration lives so much easier. We've listened to our users and
  • customers and added another bulk of useful fetch(), execute(), map() and many
  • other convenience methods that make your SQL integration fun and efficient.
  • FEATURES AND IMPROVEMENTS:
  • #231 - Add BlobBinding and ClobBinding to use java.sql.Blob and java.sql.Clob on a JDBC level
  • #584 - Add a XMLasDOMBinding that can be used to bind SQLXML data types to org.w3c.dom.Node
  • #1363 - Generate a copy constructor for POJOs
  • #1391 - Add support for the Postgres "every" aggregate function
  • #1464 - Allow for a plugin architecture in jooq-meta, jooq-codegen, for custom schema-sources and generation-targets
  • #2221 - The manual's section about "Reusing a Query's PreparedStatement" does not mention what the behaviour is, when the underlying Connection is closed
  • #2498 - Add support for SQL Standard PERCENTILE_CONT() and PERCENTILE_DISC() inverse distribution functions
  • #2626 - Add org.jooq.SQL as a plain SQL type (for templating)
  • #2639 - Add stored procedure OUT values to DEBUG log output
  • #2664 - Add flag to Loader API to enable batch execution
  • #2686 - Add Result.fetchParents(ForeignKey) and Result.fetchChildren(ForeignKey) to fetch relations in a single query
  • #2899 - Support generating code based on JPA annotations
  • #2905 - Add support for named parameters in BatchBindStep.bind()
  • #2919 - Distinguish various PostgreSQL versions in the PostgreSQL family: 9.3, 9.4
  • #2936 - Move .settings, and other Eclipse-related artefacts in a separate place
  • #3052 - Add a section to the manual explaining table-valued functions
  • #3188 - Add support for LEAD() / LAG() with Row[N] arguments
  • #3329 - Support the SQL standard array_agg function
  • #3336 - Add code generation flag to enable / disable imports in generated code
  • #3338 - Add support for ALTER TABLE ADD CONSTRAINT .. UNIQUE, PRIMARY KEY statements
  • #3376 - Add support for PostgreSQL SETOF functions
  • #3614 - DefaultRecordMapper only sets declared fields of the target type, no inherited fields
  • #3620 - Add section to the manual explaining how to use jOOQ with Nashorn
  • #3643 - Ensure that JPA annotations on private members are considered correctly
  • #3649 - Support DELETE FROM ... RETURNING
  • #3706 - Add a paragraph to the manual explaining how to manually unmarshal code generation Configuration via JAXB
  • #3708 - Emit a newline character when performing formatted logging
  • #3712 - Add Oracle Spatial examples
  • #3717 - Use try-with-resources in manual and tutorial
  • #3734 - Implement "$0" as a default expression in matcher strategy rules
  • #3744 - Add more precise subtypes for InvalidResultException
  • #3748 - Add public Routine T getValue(Parameter) and setValue(Parameter, T) methods
  • #3765 - Add support for HANA
  • #3781 - Add support for DSL.trunc(date, DatePart) for H2
  • #3784 - Add additional flags to prevent generation of individual reference classes
  • #3797 - For table-valued functions, generate also a static method in Tables.java
  • #3800 - jOOQ-Meta should log formatted queries on exception
  • #3801 - Add Result#intoMap and Result#intoGroups variants that take field index or field name
  • #3808 - Improve manual's section about batching by making it clear that bind() binds records, not individual values
  • #3810 - Add fetchOne(RecordMapper) shortcut method to ResultQuery
  • #3816 - Use char literals instead of single-character String constants where applicable
  • #3819 - Add Constants.XSD_META and Constants.NS_META to describe the new jooq-meta-x.x.xsd
  • #3830 - Add support for XSL transformation to XMLDatabase
  • #3840 - Add a JavaEE example project with EJB and JSF
  • #3842 - Add DSL.field(Name), DSL.table(Name), DSL.schema(Name), DSL.sequence(Name) methods
  • #3843 - Deprecate DSL.fieldByName(), DSL.tableByName(), DSL.schemaByName(), DSL.sequenceByName()
  • #3844 - Add a new SQLDialect.DEFAULT instead of SQL99
  • #3846 - Let examples work with latest release, not with SNAPSHOTs
  • #3847 - Document the fact that Collection

New in jOOQ 3.5.4 (Apr 2, 2015)

  • Bug fixes:
  • #4093 - Typo in Javadoc on DataType.asConvertedDataType()
  • #4096 - jooq-meta-3.5.2.xsd doesn't specify the right namespaces
  • #4100 - Use "" in javadoc
  • #4114 - Compilation error when a stored procedure has a parameter named "value" and the generator strategy generates lower case literals
  • #4117 - Invalid SQL generated when using UNSIGNED data types with MySQL DDL statements
  • #4134 - No milliseconds value when reading Timestamp values from SQLite
  • #4147 - SQLDialectNotSupportedException: ARRAY TABLE is not supported for SQL99
  • #4157 - Package procedures without arguments are not generated in Oracle 12c
  • #4160 - SQL generated by DSL.dateAdd() is invalid for certain dates in Oracle
  • #4167 - Trial version stops working

New in jOOQ 3.5.3 (Feb 24, 2015)

  • This is a patch release with some useful fixes for the 3.5 branch
  • Bug fixes:
  • #3341 - Cannot use ALTER TABLE ADD or CHANGE statements on MySQL for all column data types
  • #3940 - Batch statements do not work when queries contain inlined bind variables
  • #4056 - Query.bind(String, Object) binds only to the first occurrence of a named bind value
  • #4065 - Exception when loading array results from plain SQL queries into a Record
  • #4075 - Bad result from Query.getBindValues() when named Params are repeated

New in jOOQ 3.5.2 (Feb 11, 2015)

  • Features and improvements:
  • #4019 - Add system property to remove the logo from the log output
  • Bug fixes:
  • #3745 - NullPointerException when is not provided and isn't provided either
  • #3778 - PostgreSQL enum array types have to be cast with their fully qualified name
  • #3909 - Inefficient number to number conversion in org.jooq.tools.Convert
  • #3915 - Calls to Configuration.derive() create a Configuration that indirectly references the previous Configuration instance
  • #3919 - Bad caching of JPA-annotated getters leads to wrong mapping into POJOs that have @ConstructorProperties
  • #3924 - Four octects are sent to Postgres for each negative byte in a byte[]
  • #3932 - jooq-runtime-3.5.0.xsd declares wrong namespace
  • #3936 - AbstractQuery unnecessarily creates two DefaultRenderContext instances
  • #3946 - Replace ArrayList by ExecuteListener[] in ExecuteListeners to avoid excessive Iterator creation
  • #3947 - Avoid creating unnecessary Iterators and ArrayLists in AbstractStore.getAttachables()
  • #3957 - java.lang.NoSuchMethodException: createARRAY when using Oracle arrays with BoneCP
  • #3962 - The H2 emulation of SHR might produce rounding errors
  • #3966 - Inefficient BIT_COUNT() function for those dialects that do not natively support SHR()
  • #3976 - Code generator does not apply binding to Routines
  • #3977 - Meta.getTables() also returns entries for indexes for PostgreSQL
  • #3993 - ResultQuery.fetchAny() methods Javadoc erroneously claims throwing of InvalidResultException
  • #3998 - Cache internal BindingGetResultSetContext instance across a single Cursor
  • #4000 - Avoid {ResultSet | CallableStatement | SQLInput).wasNull() calls if not necessary, as they're somewhat expensive on some JDBC drivers
  • #4017 - jooq-meta-3.5.0.xsd is not valid XSD 1.0
  • #4022 - NullPointerException when generating SQLite table with composite primary key
  • #4028 - Loader API's "onDuplicateKeyIgnore()" executes inefficient SELECT
  • #4036 - Obsolete remark in RecordListener Javadoc about batch semantics
  • #4041 - Bad unnesting of UDT arrays in PostgreSQL
  • #4052 - NullPointerException when generating source code for PostgreSQL table-valued function that returns nested arrays

New in jOOQ 3.5.1 (Jan 22, 2015)

  • Bug fixes:
  • #3378 - Error when fully qualifying PostgreSQL table-valued functions in SELECT clauses
  • #3803 - CREATE TABLE statement does not generate NOT NULL constraint
  • #3811 - Potential NullPointerException in Cursor.fetchOne(RecordMapper) and other methods
  • #3817 - When used with set operations, ORDER BY must not contain any qualified fields
  • #3819 - Add Constants.XSD_META and Constants.NS_META to describe the new jooq-meta-x.x.xsd
  • #3822 - Invalid SQL for Postgres created with values(Row1...)
  • #3824 - PostgreSQL dateAdd() erroneously returns a TIMESTAMP value
  • #3831 - deprecation warning is displayed even if the flag is not active
  • #3833 - org.jooq.CreateTableAsStep.column(Field field, DataType type) SQLite
  • #3835 - SQLite's CREATE VIEW statement doesn't allow to rename columns
  • #3838 - Bad @Support annotations on ALTER TABLE statements, which are not supported by SQLite
  • #3855 - Oracle REAL and FLOAT types cause code generator to produce BigInteger instead of Double types
  • #3863 - CSV-Export with delimiter only does not work properly
  • #3880 - Cannot access private JavaGenerator.newJavaWriter() method
  • #3888 - Data type conversion fails when using a Binding and passing a byte[] as user input
  • #3895 The free trial version no longer works after Jan 01, 2015

New in jOOQ 3.3.2 (Apr 29, 2014)

  • Features and improvements:
  • #3199 - Add some Javadoc to Result.attach() and Result.detach() to explain the semantics
  • Bug fixes:
  • #3090 - Bad predicates generated from nullable keys on refresh(), update(), delete()
  • #3108 - Local Fields' Converters should be preferred over globally registered Converters
  • #3122 - Runtime Schema mapping doesn't work for UDT
  • #3133 - Code generation marks all PostgreSQL Fields as having a default value
  • #3143 - Bad Javadoc in the org.jooq.tools.json package: JSON tools are not "JSONAware"
  • #3147 - Field.sortAsc() and sortDesc() should generate inlined values for sort indirection
  • #3156 - "Column ambiguously defined" when emulating derived column lists with duplicate column names
  • #3162 - NullPointerException when referencing window name that was not declared
  • #3164 - Missing formatting when rendering formatted MERGE statement's SET clause
  • #3176 - Don't generate "assignment-constructors" for POJOs and Records with more than 255 columns
  • #3214 - Error when inserting PostgreSQL enum array

New in jOOQ 3.3.1 (Mar 8, 2014)

  • Features and improvements:
  • #3096 - Add Constants.XSD_RUNTIME, NS_RUNTIME, XSD_CODEGEN, NS_CODEGEN
  • Bug fixes:
  • #3011 - Routines do not propagate errors raised from T-SQL procedures due to
  • JDBC API misuse
  • #3057 - Wrong paths in maven-install.sh and maven-install.bat
  • #3060 - Conversion fails for Oracle VARRAY / TABLE types, nested in UDTs
  • #3069 - jOOQ calls Clob.free(), which is available only in JDBC 4.0 / Java 1.6
  • #3084 - SQL Server unique indexes are not loaded by jOOQ-meta
  • #3101 - MutablePOJOMapper doesn't work with annotated boolean getters

New in jOOQ 3.3.0 (Feb 15, 2014)

  • Features and improvements:
  • #531: Add support for the WINDOW clause
  • #845: Add support for the T-SQL and Oracle 12c CROSS APPLY clause
  • #846: Add support for the T-SQL and Oracle 12c OUTER APPLY clause
  • #1070: Add support for SQL Server table-valued functions
  • #1506: Allow for inserting empty records through INSERT INTO .. DEFAULT VALUES
  • #2093: Add comment functionality from DISQUS to website
  • #2246: Add T DSLContext.fetchValue(Select) to support more typesafety when fetching single values
  • #2576: Integrate with Travis-CI to run automated builds
  • #2657: Add support for ORDER BY .. SEEK .. LIMIT to implement the "seek method" for faster offsets
  • #2709: Add Record[N].value1(xx), value2(xx) setter methods
  • #2734: Add support for lateral derived tables
  • #2744: Emulate INSERT .. RETURNING through SELECT FROM FINAL TABLE (INSERT ...) in DB2
  • #2767: Add support for CUBRID 9.2 features
  • #2776: Add support for the PostgreSQL ONLY clause
  • #2778: Add detailed section to the manual about settings.xml
  • #2779: Add support for LEFT(), RIGHT() functions
  • #2780: Add PostgresDSL.oid(Table) to produce table.oid references
  • #2784: Add DSL.row(Collection) to allow for interacting with collections of values or Fields
  • #2790: Add a Context data map scoped to the current subquery
  • #2801: Mention licensing options from the manual, add help message to jOOQ-Codegen when OSS users try using commercial databases
  • #2805: Add seekAfter() and seekBefore() to allow for paging in both directions
  • #2806: Add ResultQuery.fetchSize() to influence the JDBC Statement's fetch size
  • #2809: Add support for MySQL's MID() function, which is a synonym for SUBSTRING()
  • #2810: Add support for the REVERSE() function, where it is supported
  • #2824: Log 500 records on TRACE level, instead of just 5
  • #2828: Use a default Database for code generation, in the absence of an explicit database
  • #2829: Enhance Loader API to allow for importing JSON data in addition to CSV data
  • #2832: Add OracleDSL.toChar()
  • #2838: Add more sophisticated CustomField example to the manual
  • #2840: Add DSL.date(), DSL.time(), and DSL.timestamp() to extract date, time, timestamp parts from a TIMESTAMP
  • #2844: Let JAXB emit more warnings when loading the code generation configuration
  • #2848: Add support for infix-notation for bitwise operations
  • #2851: Add some documentation to the manual about custom code sections in generated code
  • #2853: Add DSLContext.fetchFromJSON()
  • #2854: Add a JAX-RS (with Spring) and jOOQ example to the manual
  • #2860: Add manual section about using jOOQ with Groovy
  • #2876: Add some Javadoc about the fact that some SQLDialects are available in commercial distributions only.
  • #2883: Add support for PostgreSQL COUNT(DISTINCT(a, b, ...)) through DSL.countDistinct()
  • #2885: Generated enum values contain extra comma
  • #2891: Add a jOOQ / Spring-TX example to GitHub under jOOQ-examples
  • #2894: Enable automated CI on github
  • #2898: Add DSL.generateSeries(int, Field) and (Field, int) overloads
  • #2900: Overload MockFileDatabase constructor to allow for Readers, InputStreams, and Strings
  • #2909: Improve manual's jOOQ syntax highlighting: Highlight SQL keywords
  • #2912: Add convenience methods set(Connection), set(DataSource), derive(Connection), derive(DataSource) to DefaultConfiguration
  • #2915: Log JDBC URL in code generator configuration log
  • #2921: Add support for ad-hoc table renaming
  • #2931: Add DSLContext.fetchCount(Table) and fetchCount(Table, Condition)
  • #2932: Retry loading the GenerationTool configuration file with a / prepended if it fails
  • #2933: Add {Result.into|ResultQuery.fetch}{Map|Group}({Field|Field[]}, RecordMapper)
  • #2944: Add support for GROUP_CONCAT in SQLite
  • #2945: Deprecate the code generation flag
  • #2946: Add a section to the manual explaining how to programmatically configure the code generator
  • #2950: Add Table.getComment() and Field.getComment() to access comment meta information from the schema
  • #2969: Add support for SQL Server SOUNDEX() and DIFFERENCE() functions
  • #2970: Add DSL.isnull() as a synonym for NVL() for the SQL Server dialect
  • #2971: Add DSL.space() to support the SQL Server specific SPACE() function
  • #2976: Add bookmarks to the PDF manual
  • #2979: Add Maven install scripts (.bat and .sh) to deliverables
  • #2981: Add an official Spring / Guice example
  • #2984: Add Table table(Result) to allow to fetch from / join / etc in-memory tables
  • #2985: Add DSL.values(RowN...)
  • #3001: Add VisitContext.clausesLength() and queryPartsLength() to indicate the depth of the currently visited QueryPart tree
  • #3002: Add the BindVariableAbbreviator VisitListener example to the manual
  • #3009: Add DSL.dateAdd(Field, Field

New in jOOQ 3.2.3 (Jan 30, 2014)

  • Features and improvements:
  • Add PostgresDSL.oid(Table) to produce table.oid references
  • Add Maven install scripts (.bat and .sh) to deliverables
  • Overload MockFileDatabase constructor to allow for Readers, InputStreams, and Strings
  • Bug fixes:
  • Invalid column type: 16, when binding null as java.lang.Boolean onto a NUMBER(..) column in Oracle
  • jooq-codegen-maven should use a target directory relative to the module
  • The new matchers configuration cannot be used with Maven (added documentation)
  • Improve code generator compatibility with PostgreSQL 8.x by removing the selection of INFORMATION_SCHEMA.COLUMNS.IDENTITY_GENERATION
  • Improve code generator compatibility with PostgreSQL 8.x by avoiding casting to enum types
  • Add code-generation support for the MySQL TINYTEXT data type
  • Fix trailing whitespaces in generated code
  • isFalse()/isTrue() result in extra parameters
  • Error when the code-generation database user has insufficient grants to read the "mysql" meta schema
  • Lower log level for warnings about unknown SQL data types from MetaDataFieldProvider (plain SQL)
  • Missing parent pom.xml file in deliverables
  • Variable binding doesn't work in vendor-specific UPDATE t1 JOIN t2 queries, when joined tables are subqueries with bind values
  • Bind values are not debug-logged for standalone stored procedure or function calls

New in jOOQ 3.2.2 (Dec 17, 2013)

  • Bug fixes:
  • Improve ArrayIndexOutOfBoundsException: -1 error message when unknown field is accessed from a record
  • UpdatableRecord.store() and DSLContext.executeInsert() show different behaviour with respect to NULL value insertion
  • AbstractStoreQuery.prepare() does not apply RenderKeywordStyle when specifying column names for return after INSERT
  • Remove unnecessarily cached Connection in DataSourceConnectionProvider
  • Check if ALL_MVIEW_COMMENTS exists before using it (e.g. against an Oracle 9i database)
  • Wrong implementation for check if ALL_COLUMNS.DEFAULTED exists
  • Disambiguate collisions between enum literals and package names
  • DefaultRecordMapper should attach resulting records according to Settings.attachRecords, if target type implements Attachable
  • Possible StackOverflowError when using plain SQL tables with inlined QueryParts
  • Added a Javadoc remark about certain SQL dialects being available in commercial distributions only
  • An exception in the check constraint loader can cause all constraint loading to fail
  • Inconsistent logic executed between Record.setValue(Field, T) and BookRecord.setId(Integer) (generated)

New in jOOQ 3.2.0 Alpha 1 (Aug 27, 2013)

  • Features and improvements
  • #1079 - Add support for Oracle's FLASHBACK QUERY clause
  • #1903 - Duplicate Query construction API between DSLContext and DSL
  • #2010 - Add listener API to Record / UpdatableRecord
  • #2542 - Add an org.jooq.Keyword type and DSL.keyword(String) to construct it
  • #2593 - Add Meta.getPrimaryKeys()
  • #2594 - Add primary key and foreign key navigation support in JDBCDatabase
  • #2595 - Add implicit conversions from Scala functions to RecordMapper
  • #2603 - Add flag to code generation configuration to
  • indicate that and shall also match column names
  • #2606 - Distinguish Oracle10g, Oracle11g, Oracle12c SQLDialects within the
  • ORACLE family
  • #2618 - Document the fact that different packages are generated for different
  • schemas
  • #2619 - Add an example ExecuteListener to the manual, showing how UPDATE and
  • DELETE statements without WHERE clause can be aborted
  • #2630 - Add DSL.queryPart(String, Object...) and similar methods to create
  • simple plain SQL query parts
  • #2660 - Add some documentation about jOOQ not supporting operator precedence
  • #2665 - Implement SPI for RenderContext listening to allow for custom SQL
  • transformation
  • #2666 - Pull up RenderContext.sql(QueryPart) and BindContext.bind(QueryPart)
  • to Context.visit(QueryPart)
  • #2667 - Add org.jooq.Clause and let org.jooq.Context listen on start(Clause) and
  • end(Clause) events
  • #2676 - Add QueryPartInternal.clause() to allow for QueryParts to return Clause
  • information to org.jooq.Context
  • #2689 - Expose a DAO's internal RecordMapper through DAO.mapper()
  • #2696 - Provide default implementation for CustomQueryPart.bind() (for all
  • Custom QueryParts)
  • #2699 - Generate DEFAULT and NULL metadata information on generated DataTypes
  • #2701 - Document the fact that jOOQ sets changed flags to true, even if
  • Record.setValue() sets the value already present in the record
  • #2702 - Add DataType.defaulted() and DataType.nullable()
  • #2706 - Generate "full" constructors in records, allowing to construct a record
  • with all values set
  • API changes (backwards-compatible):
  • #2581 - Deprecate fetchLater() and FutureResult
  • #2662 - Deprecate the internal method DSLContext.bind(QueryPart,
  • PreparedStatement)
  • Bug fixes:
  • #2586 - Bad SQL dialect referenced from ASE's and CUBRID's package-info.java
  • #2591 - Result.intoGroups() and similar methods create key Records with
  • changed=true
  • #2592 - Qualified names created using DSL.name(String...) should not render null
  • or empty string parts
  • #2596 - Scala tests don't run with Maven
  • #2608 - Error in code generator when the sqlite_sequence table is missing
  • #2613 - The batch INSERT query example in the manual is no longer correct with
  • jOOQ 3.x
  • #2624 - Wrong SQL Server 2012 detection in jOOQ-Meta
  • #2628 - Add missing Javadoc to DefaultDSLContext
  • #2634 - Minor documentation bug: The MockDataProvider uses toLowerCase() but
  • upper-cases SQL keywords
  • #2690 - Inaccurate runtime xsd versions in 3.1 manual
  • #2703 - SQLDialect.getNameLC() and getNameUC() are not NPE-safe
  • #2707 - PostgreSQL ENUM ordering is inconsistent with the database
  • #2708 - Wrong SQL rendered for CAST(x AS DECIMAL(y, z)). Precision and scale are
  • lost

New in jOOQ 3.1.0 (Jul 1, 2013)

  • Features and improvements:
  • Add SQLDialect.family() to group several SQLDialect versions of the same
  • RDBMS
  • Improve MySQL Stored Procedure support using MySQL 5.5's
  • INFORMATION_SCHEMA.PARAMETERS dictionary table
  • Add integration tests for both jconn3 and jTDS JDBC drivers for Sybase
  • and SQL Server
  • Map SQL Server TINYINT to UByte
  • Add support for Sybase SQL Anywhere unsigned number types
  • Add Field DSL.coerce(Field, DataType) and similar methods,
  • to coerce a field to a given data type (as opposed to casting it)
  • Document using jOOQ with Spring for transaction support
  • Add test to count opening and closing of Statements and ResultSets by
  • jOOQ
  • Add support for SQL Server 2012 windowing clauses in window functions
  • Add support for the MariaDB database
  • Document 's feature of forcing a column onto a SQL type
  • Add Result DSLContext.fetchFromTXT() to allow for loading results
  • that were exported using Result.format()
  • Add DSLContext.batch(String...) and batch(String, Object[]...) to easily
  • create batch statements from SQL strings
  • Add DSLContext.fetchAny(Table, Condition) method and others
  • Allow for setting ResultSet flags (e.g.
  • ResultSet.TYPE_SCROLL_INSENSITIVE through
  • ResultQuery.resultSetConcurrency(), resultSetType(),
  • resultSetHoldability()
  • Add DSL.using(Connection) and DSL.using(Connection, Settings) which
  • auto-detect the SQLDialect from the jdbc url
  • Add Configuration.recordMapperProvider() to override jOOQ's internal
  • default ReflectionMapper
  • Support CUBRID 9.1's new features
  • Add a new ControlFlowSignal that is used to explicitly jump out of a
  • control flow
  • Add support for Postgres / HSQLDB's TRUNCATE [...] RESTART / CONTINUE
  • IDENTITY
  • Add support for Postgres' TRUNCATE [...] CASCADE statement
  • Simulate row value expression IN predicate using EXISTS
  • Add Setting to influence parameter rendering (indexed, named, inlined)
  • Add Result.intoXML(org.xml.sax.ContentHandler) to generate a SAX event
  • stream from a jOOQ result
  • Add support for SQL Server 2012 native OFFSET .. FETCH clause
  • Integration-test jOOQ with the SQLite xerial driver
  • Add DSLContext.batch(Query, Object[]...) as a convenience for calling
  • batch(Query).bind(Object...).bind(Object...)
  • Add more Javadoc to ResultQuery.fetchResultSet() explaining that
  • underlying PreparedStatements are closed with ResultSet.close()
  • Simulate row value expression comparison predicates using EXISTS
  • Add CustomQueryPart for use with plain SQL and other places
  • Add Field.compare(Comparator, Select) and Field.compare(Comparator,
  • QuantifiedSelect) to allow for more dynamic SQL
  • Add RenderContext.paramType() and deprecate RenderContext.inline() and
  • .namedParams()
  • Expose the DataSource contained in the DataSourceConnectionProvider
  • Add DSL.cast(Field, XXX) for increased API consistency
  • Add JDBCUtils.dialect(Connection) to "guess" the jOOQ SQLDialect from a
  • JDBC Connection
  • Add a public DefaultDSLContext implementation that can be used by users
  • to override the default behaviour
  • Allow for treating Field as Condition
  • Add support for SQL Server 2012 sequences
  • Add JDBCUtils.safeClose(Connection)
  • Expose CHECK constraints in jOOQ-meta
  • Add Record.from(Object, Field...) from(Object, String...),
  • from(Object, int...) to copy only a select set of values from a POJO,
  • Array, Map
  • Add {Row|Record}.fields(Field...), {Row|Record}.fields(String...),
  • {Row|Record}.fields(int...) to extract Field[] from a row or record
  • Add org.jooq.tools.jdbc.DefaultResultSet to provide a default ResultSet
  • delegation implementation
  • Add integration tests mapping binary(16) to java.util.UUID
  • Let batch executions debug-log executed queries
  • Convert.convert(Object, Class) should support simple casting
  • Document some SQL language to jOOQ DSL API mapping rules in the manual
  • Upgrade integration test jTDS version to 1.3.1
  • Add a new RecordType type to make up for the missing
  • recursive type definition on Record
  • API changes (backwards-incompatible):
  • MergeNotMatchedSetStep.set(Field, Select) returns
  • MergeMatchedSetMoreStep instead of MergeNotMatchedSetMoreStep
  • Bug fixes:
  • Handle Ingres', SQLite, SQL Server's, Sybase ASE's limitations of 1024,
  • 999, 2100 or 2000 maximum bind values per query
  • Postgres ENUM data type isn't supported correctly, if the ENUM needs
  • full qualification
  • NullPointerException when calling Schema.getTables() on a meta schema
  • with SQLite
  • Bad package name generated when contents are not trimmed
  • Cannot combine with if both match

New in jOOQ 3.0.1 (May 27, 2013)

  • Bug fixes:
  • NullPointerException when calling Schema.getTables() on a meta schemawith SQLite
  • Bad package name generated when contents are not trimmed
  • Suppress warnings in generated code (@SuppressWarnings("all") doesn'tsuppress "rawtypes" warnings with javac)
  • RenderContext.data() is not passed on to QueryParts when being rendered
  • Integration-test jOOQ with the SQLite xerial driver
  • Manual refers to a package-private DefaultConfiguration constructor
  • JDBCDatabase doesn't recognise Oracle's VARCHAR data type (and othervendor-specific data types)
  • Tables collected through DSLContext.meta() return duplicate columns ifmulti-schema environments contain identical tables
  • DSLContext.meta() returns Table objects for Oracle SYNONYMS, withoutproviding columns
  • JDBCDatabase doesn't use DataType.length(), precision(), and scale()
  • Cannot set precision on TINYINT, SMALLINT, INT, BIGINT data types
  • Bad SQL rendered from DELETE statements with aliased tables
  • NullPointerException in AbstractResultQuery.fetchOneMap()
  • MySQL's unsigned types cannot be used in other dialects
  • IngresDatabase erroneously joins IIINDEXES to get constraint columns,rather than using IIKEYS

New in jOOQ 3.0.0 (Apr 29, 2013)

  • SELECT statements
  • INSERT and MERGE statements: the VALUES() clause
  • UPDATE statements: SET A = (SELECT...)
  • UPDATE statements with row value expressions: SET (A, B) = (SELECT...)
  • Quantified comparison predicates: ANY(SELECT...) and ALL(SELECT...)
  • Comparison predicates: = (SELECT...)
  • IN predicates: IN (SELECT...)
  • BETWEEN predicates: BETWEEN (SELECT...) AND (SELECT...)
  • Generated records
  • The new VALUES() constructor
  • Scala integration for conversion of jOOQ Record[N] to Scala's Tuple[N]
  • Factory has been split into DSL (static QueryPart construction) and
  • DSLContext (Query execution, "attached" QueryPart construction). This greatly
  • improves the overall DSL experience while allowing for more fine-grained
  • Executor lifecycle control.
  • A ConnectionProvider has been introduced as an abstraction of the JDBC
  • Connection lifecycle. The standalone Connection and pooled DataSource modes
  • are still supported, but you can now inject your own ConnectionProvider for
  • more control.
  • A lot of performance improvements have been implemented within the jOOQ API
  • removing most of the overhead caused by jOOQ when fetching data from JDBC
  • A JDBC Mock API has been added to help you create simple unit tests for your
  • application built on top of jOOQ.
  • A VALUES() constructor is now supported, and derived column lists to alias
  • tables and columns in one go.
  • The data type API has been greatly simplified. This allowed for the
  • introduction of runtime precision, scale, and length information.
  • CRUD has been improved through many more CRUD batch operations, explicit
  • INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's
  • internal changed flags.

New in jOOQ 3.0.0 RC 3 (Apr 12, 2013)

  • Features and improvements:
  • Remove the standalone tutorial, link to the manual
  • Implement various Key.toString() methods
  • Add Javadoc to Configuration.executeListenerProviders()
  • Add hint to the manual about mvn eclipse:clean and eclipse:eclipse when
  • building jOOQ
  • Change the readme file to use Markdown
  • Add org.jooq.util.example package to jOOQ-codegen with some example
  • GeneratorStrategies
  • Add aliases for arithmetic operators to be able to use Groovy default
  • operator overloading
  • Make org.jooq.impl.DefaultConfiguration public
  • Add Configuration.set() methods. They should allow for modifying a
  • Configuration
  • Add DSL.function(Name, Class, Field...) and
  • DSL.function(Name, DataType, Field...) to allow for custom,
  • fully-qualified function references
  • Bug fixes:
  • Cursor.close() doesn't terminate the ExecuteListener life cycle
  • "HsqlException: incompatible data type in conversion" when binding a
  • UUID[] to an HSQLDB prepared statement
  • Compilation error in generated tables, when a table contains a UNIQUE
  • key but no PRIMARY key
  • Documentation example regarding DSL.concat() does not compile
  • jOOQ 3.0 regression: NoClassDefFoundError caused by missing log4j
  • dependency
  • Tutorial example unclear: There are three artefacts in Maven, not one
  • org.jooq.Meta's generated Schema and other objects are Serializable, but
  • their enclosed Meta instance is not
  • Let equals() implementations succeed early on identity
  • Single page manual display errors on Firefox
  • Inaccurate Configuration Javadoc explaining wrong ExecuteListener
  • lifecycle
  • SQLite identifiers that collide with keywords should be quoted
  • Do not add TableFieldImpl to table in constructor of TableFieldImpl
  • fetchOne() and fetchLazy() don't terminate the ExecuteListener life
  • cycle when an exception occurs
  • Fully qualified name not used for user-defined aggregate function

New in jOOQ 3.0.0 RC 2 (Mar 8, 2013)

  • Factory has been split into Factory (static QueryPart construction) and
  • Executor (Query execution, "attached" QueryPart construction). This greatly
  • improves the overall DSL experience while allowing for more fine-grained
  • Executor lifecycle control.
  • A ConnectionProvider has been introduced as an abstraction of the JDBC
  • Connection lifecycle. The standalone Connection and pooled DataSource modes
  • are still supported, but you can now inject your own ConnectionProvider for
  • more control.
  • A lot of performance improvements have been implemented within the jOOQ API
  • removing most of the overhead caused by jOOQ when fetching data from JDBC
  • A JDBC Mock API has been added to help you create simple unit tests for your
  • application built on top of jOOQ.
  • A VALUES() constructor is now supported, and derived column lists to alias
  • tables and columns in one go.
  • The data type API has been greatly simplified. This allowed for the
  • introduction of runtime precision, scale, and length information.
  • CRUD has been improved through many more CRUD batch operations, explicit
  • INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's
  • internal changed flags.

New in jOOQ 3.0.0 RC 1 (Feb 18, 2013)

  • Factory has been split into Factory (static QueryPart construction) and
  • Executor (Query execution, "attached" QueryPart construction). This greatly
  • improves the overall DSL experience while allowing for more fine-grained
  • Executor lifecycle control.
  • A ConnectionProvider has been introduced as an abstraction of the JDBC
  • Connection lifecycle. The standalone Connection and pooled DataSource modes
  • are still supported, but you can now inject your own ConnectionProvider for
  • more control.
  • A lot of performance improvements have been implemented within the jOOQ API
  • removing most of the overhead caused by jOOQ when fetching data from JDBC
  • A JDBC Mock API has been added to help you create simple unit tests for your
  • application built on top of jOOQ.
  • A VALUES() constructor is now supported, and derived column lists to alias
  • tables and columns in one go.
  • The data type API has been greatly simplified. This allowed for the
  • introduction of runtime precision, scale, and length information.
  • CRUD has been improved through many more CRUD batch operations, explicit
  • INSERT and UPDATE (in addition to store()), and explicit handling of jOOQ's
  • internal changed flags.

New in jOOQ 2.6.2 (Feb 5, 2013)

  • #2055 - MySQL's UPDATE [t1] JOIN [t2] syntax can cause syntax errors as column
  • references are not fully qualified
  • #2057 - Cannot properly extract bind values for LIMIT .. OFFSET clause from a
  • SELECT statement
  • #2063 - jOOQ-meta loads Firebird composite unique key columns in wrong order
  • #2073 - The code generator's flag doesn't affect Oracle
  • VARRAY and TABLE types
  • #2082 - Oracle PIVOT expression doesn't bind any variables of a derived table
  • being pivoted
  • #2085 - java.lang.NoSuchMethodError: org.apache.log4j.Logger.isTraceEnabled()Z
  • when logger dependency is missing
  • #2098 - NullPointerException when org.jooq.impl.EnumConverter converts null
  • #2104 - SQLite code generation treats multi-column primary keys like multiple
  • single-column unique keys
  • #2108 - SQLite returns NULL for val(new Date(0)).add(-1) and some other date
  • time arithmetic expressions
  • #2125 - Regression in batchStore() for Postgres and jOOQ 2.6.1
  • #2130 - Misleading Javadoc in Factory.selectCount()
  • #2139 - batchStore with composite types incorrectly reuses values from the first
  • record
  • #2146 - Improve AbstractField.equals() and AbstractTable.equals() and similar,
  • as these two are called very often
  • #2149 - Improve QueryPartList.removeNulls() as this is called very often

New in jOOQ 2.6.1 (Dec 27, 2012)

  • #1890 - Bad Postgres array serialisation when " or \ characters are contained in
  • a String[]
  • #1937 - Inefficient implementations of AbstractDataType.equals() and hashCode()
  • #1938 - Improve AbstractField.hashCode() and AbstractTable.hashCode() and
  • similar, as these two are called very often
  • #1942 - Inefficient call to String.split() in StringUtils.toCamelCase() leads to
  • non-negligible performance ovrerhead in POJO transformation calls
  • #1954 - Bad SQL rendered when combining ORDER BY [ some-function ] with LIMIT
  • .. OFFSET in DB2, SQL Server
  • #1958 - Bad SQL rendered for OVER (ORDER BY [ some-function ]) for SQL Server
  • and Sybase
  • #1979 - Thread safety issue in org.jooq.impl.FieldList
  • #1992 - Bad reference to org.jooq.debug.[impl].DebugListener in the manual
  • #1993 - Bad code generated when the same table name exists in multiple schemas
  • in SQL Server
  • #1995 - Record.original() values aren't updated after a Record.store() operation
  • #2007 - Bad type coercion on the right hand side of a comparison predicate, when
  • the left hand side is Field
  • #2011 - Implement some micro-optimisations in DefaultRenderContext
  • #2045 - Bad hashCode calculation when Records contain arrays or byte[]

New in jOOQ 2.6.0 (Oct 26, 2012)

  • Features and improvements:
  • #385 - Allow for keeping open statements in a Query
  • #600 - Add support for Oracle / SQL Standard linear regression functions
  • #1058 - Add Factory.row(T1, T2, .. TN) and Factory.row(
  • Field, Field ... Field) to allow for creating tuples / rows
  • #1077 - Add support for the SQL standard OVERLAPS predicate
  • #1245 - Improve formatting for DECIMAL data types in Result.format(). Nicely
  • align the decimal point and reserve space on both sides
  • #1484 - Let XJC-generated artefacts implement Cloneable
  • #1527 - Support for converting String to java.net.URL, java.net.URI, and
  • java.io.File
  • #1674 - Export data types with Result.formatXML() and Result.formatJSON()
  • exports
  • #1679 - Add Factory.table(String, QueryPart...)
  • #1708 - Add Map ResultQuery.fetchGroups(Field, Class)
  • #1709 - Add Map ResultQuery.fetchGroups(Field[])
  • #1710 - Add Map
  • ResultQuery.fetchGroups(Field[], Class)
  • #1719 - Make logic from ResultQuery.fetchArray() available in Result.intoArray()
  • #1728 - Add support for the MySQL COUNT(DISTINCT expr, expr...) aggregate
  • function syntax
  • #1744 - Add support for the CUBRID DECR() function
  • #1756 - Add RecordMapper, similar to RecordHandler, mapping records to
  • custom types
  • #1762 - Add package-info.java to add Javadoc documentation to all packages
  • #1766 - Simulate row comparisons where they are not supported
  • #1773 - Add a new jOOQ-Scala project and jooq-scala artefactId, to contain jOOQ
  • extensions in the Scala language
  • #1782 - Move JAXB bindings out of XSD, in order to support more advanced
  • bindings
  • #1783 - Generate @SuppressWarnings("all") in jOOQ-generated artefacts
  • #1784 - Enhance the BETWEEN predicate, introducing the AND keyword
  • #1810 - Add Map ResultQuery.fetchMap(Field, Class) and
  • Result.intoMap(Field, Class)
  • #1816 - Add support for materialized views in Oracle's code generator
  • #1828 - Reduce log level for Factory deserialisation to TRACE
  • #1837 - Add support for @java.beans.ConstructorProperties when fetching into
  • immutable POJOs
  • #1841 - Add SortField Field.sort(SortOrder) to allow for dynamic sorting
  • #1842 - Add Condition Field.compare(Comparator, Field) to allow for dynamic
  • comparisons
  • #1844 - Add Table Table.join(TableLike, JoinType) to allow for
  • dynamic joining
  • #1845 - Add Factory.schemaByName(String) for plain SQL schemata
  • #1848 - Add Record.changed() to indicate whether a Record contains "dirty"
  • values
  • #1849 - Add Record.original() to obtain the originally fetched values from a
  • Record
  • #1854 - Add ResultQuery.maxRows(int) to limit the number of actually fetched
  • records
  • #1855 - Add Query.cancel() to support for interrupting statements prematurely
  • #1856 - Add Query.queryTimeout(int) to support for JDBC's
  • Statement.setQueryTimeout()
  • API changes (backwards-compatible):
  • #1800 - Deprecate AliasProvider
  • #1807 - Result.intoArray() declares "throws MappingException", which isn't true
  • #1839 - Deprecate the various Result.getValuesAs[Type] and
  • Record.getValueAs[Type] methods
  • #1840 - Deprecate org.jooq.Store
  • #1866 - Deprecate [Schema-Name]Factory, remove reference to it from the
  • tutorials
  • #1869 - Deprecate org.jooq.NamedQueryPart
  • #1870 - Deprecate org.jooq.NamedTypeProviderQueryPart
  • #1872 - Improve jOOQ's RenderContext pretty printing behaviour
  • #1881 - Deprecate ConditionProvider, OrderProvider, LockProvider types
  • Bug fixes:
  • #1593 - Factory.field("{1} + {0} + {0}", val(1), val(2)) doesn't work. Cannot
  • re-use / re-order placeholders
  • #1720 - Improve performance by using Record.getValue(int) instead of
  • Record.getValue(Field) internally, where more than one value is
  • retrieved from a record
  • #1751 - Result.intoResultSet() generates wrong ResultSetMetaData if runtime
  • schema mapping is applied
  • #1764 - Add missing @Support({ ... FIREBIRD ... }) annotations
  • #1768 - NullPointerException when DAO.fetchOne() returns no record
  • #1774 - QueryPart.toString() does not load default settings from classpath
  • #1786 - Fix SEQUENCE support for Firebird
  • #1791 - Log a table's input/output names, and PK name when generating code
  • #1792 - Factory.fieldByName() and tableByName() do not correctly escape quotes
  • #1797 - SQL syntax errors when plain SQL contains comments with question marks
  • and SQL is executed as StatementType.STATIC_STATEMENT
  • #1802 - Result.into(Table) doesn't work correctly, if the same field name
  • appears twice in Result
  • #1806 - Let Record.toString() wrap the record in a temporary Result and call
  • Result.toString() instead
  • #1819 - MappingException in Record.into(Class), when POJO setters have
  • applicable names but non-applicable argument types
  • #1820 - Cannot fetch into non-public POJO classes. Their members / getters /
  • setters should be made accessible
  • #1829 - Factory.execute(String) may cause errors when plain SQL returns results
  • #1830 - Allow for passing null or empty arrays to intoMap(Field[]) and
  • intoGroups(Field[])
  • #1850 - Record.equals() returns true as soon as both records hold a "null" value
  • for a given field
  • #1860 - Bad Results returned from plain SQL "select *" queries, if several
  • selected columns share the same name
  • #1876 - NULL constraint violation when storing a copied record

New in jOOQ 2.5.1 (Sep 24, 2012)

  • Result.intoResultSet() generates wrong ResultSetMetaData
  • if runtime schema mapping is applied
  • Add missing @Support({ ... FIREBIRD ... }) annotations
  • NullPointerException when DAO.fetchOne() returns no
  • record
  • QueryPart.toString() does not load default settings from
  • classpath
  • Fix SEQUENCE support for Firebird
  • Factory.fieldByName() and tableByName() do not correctly
  • escape quotes
  • SQL syntax errors when plain SQL contains comments with
  • question marks and SQL is executed as
  • StatementType.STATIC_STATEMENT
  • Result.into(Table) doesn't work correctly, if the same
  • field name appears twice in Result
  • MappingException in Record.into(Class), when POJO setters
  • have applicable names but non-applicable argument types
  • Cannot fetch into non-public POJO classes. Their members
  • / getters / setters should be made accessible
  • Factory.execute(String) may cause errors when plain SQL
  • returns results

New in jOOQ 2.5.0 (Aug 27, 2012)

  • Features and improvements:
  • #430 - Add support for the Firebird database
  • #457 - Add support for Oracle user-defined AGGREGATE functions
  • #620 - Add support for the SQL:2008 standard LIKE_REGEX operator
  • #722 - Remove casting of bind values in Ingres
  • #727 - Simulate RPAD and LPAD in SQLite
  • #816 - Add support for Oracle Text functions
  • #1339 - Add option to generate immutable pojos
  • #1547 - Support "optimistic locking" in UpdatableRecord.store()
  • and delete()
  • #1552 - Generate fetchBy[ColumnName] methods in generated DAO
  • classes
  • #1553 - Add some Javadoc to document the difference between using
  • a Factory with a Connection or with a DataSource
  • #1556 - Add javax.validation API to full deliverable
  • #1565 - Add Factory.connectByRoot(Field) to support the Oracle
  • CONNECT_BY_ROOT pseudo column
  • #1570 - Add Factory.condition(String, QueryPart...) similar to
  • Factory.field(String, QueryPart...)
  • #1582 - Add support for Oracle's ORDER SIBLINGS BY clause, in
  • combination with CONNECT BY
  • #1586 - Add missing constructors taking DataSource to dialect-
  • specific factories
  • #1587 - Generate missing constructors taking DataSource in
  • schema-specific factories
  • #1595 - Simulate REPEAT() in SQLite
  • #1596 - Add support for optimistic locking using generated
  • information about "timestamp" or "version" columns
  • #1627 - Handle NULL in CSV imports/exports
  • #1645 - Add support for Oracle's PARTITION BY clause in OUTER
  • JOINs
  • #1657 - Reorganise the manual
  • #1664 - By default, activate in the code generator
  • #1665 - Add support for the empty GROUP BY () clause
  • #1675 - Add support for the SQL standard IS [NOT] DISTINCT FROM
  • predicate
  • #1680 - Overload all plain SQL DSL methods to also accept
  • QueryPart arguments
  • #1681 - Simulate empty GROUP BY () clause in Sybase ASE and
  • Ingres, joining a dummy table and grouping by a constant
  • field
  • #1684 - Add Setting to indicate that fetched
  • records shouldn't be automatically "attached"
  • #1685 - Improve Javadoc of Attachable.attach(). Document how
  • "detaching" works
  • #1688 - Add E Record.into(E) as a complement to
  • E Record.into(Class)
  • #1692 - Replace Factory.executeInsert(), Factory.executeUpdate()
  • and similar methods with more succinct variants
  • #1696 - Add short versions of comparison predicate methods, such
  • as eq, ne, gt, ge, lt, le
  • #1698 - Add support for the SQL standard BETWEEN SYMMETRIC
  • predicate
  • #1701 - Add Factory.not(Condition) as a synonym for
  • Condition.not()
  • #1704 - Document the behaviour of Factory.newRecord(Table,
  • Object) and Record.from(Object) with respect to
  • UpdatableRecord.store()
  • #1707 - Add Map ResultQuery.fetchGroups(
  • Field) and Result.intoGroups(Field)
  • #1712 - Add

New in jOOQ 2.4.0 (Jul 9, 2012)

  • Add Result.intoResultSet() to wrap a Result in a JDBC ResultSet
  • Avoid JDBC escape syntax for date/time literals
  • Generate DAO classes and interfaces for POJOs
  • Document the lifecycle of an ExecuteListener in the Javadoc
  • Add support for Postgres "any" data type (with quotes!).
  • This seems to map well to java.lang.Object
  • Support case-insensitive schema names in code generation
  • Add some WARN-level logging when the source-code generator doesn't generate any artifacts
  • Add Field.likeIgnoreCase() to support Postgres' ILIKE operator
  • Add Factory(DataSource) and similar constructors
  • Add Factory.batchStore(Collection>) for convenience
  • Add DataType.convert(Object...) and
  • DataType.convert(Collection) for convenience
  • Add org.jooq.Name Factory.name(String) to construct QueryParts that are escaped according to Settings.getRenderNameStyle()
  • Add Factory.fetch(String, QueryPart...) and Factory.execute(String, QueryPart...) and similar methods
  • to support arbitrary QueryParts in plain SQL
  • Add UniqueKeyDefinition.isPrimaryKey() for completeness
  • Add Result Factory.fetchFromCSV(String)
  • Add top-level pom.xml for jooq-parent artefact (GitHub Issue #14)
  • Converting arbitrary strings to Number / Date should return null, instead of throwing an exception
  • Generate some meaningful Javadoc into the generated [schema-name]Factory classes
  • Add line breaks to generated Javadoc where appropriate
  • Add option to let generated Record / POJO objects implement a common generated interface
  • Support interface types in ResultQuery.fetchInto(Class),
  • Result.into(Class), and Record.into(Class) methods, returning a proxy
  • Upgrade internal jOOR dependency to jOOR 0.9.4
  • Add IdentityDefinition to jooq-meta
  • Add support for conversion of String to java.sql.{Date, Time, Timestamp}. GitHub issue #22
  • Document behaviour of fetch() and fetchOne() in case jOOQ cannot fetch actual records
  • Minor improvements in the generator source code. GitHub pull request #23
  • Generate additional setters for foreign keys, accepting records as arguments
  • Expose Connection methods, such as commit(), rollback() and similar transaction-related methods in Factory
  • Support ROW_NUMBER() OVER() for the latest version of Derby and H2, which support it
  • Simulate ROW_NUMBER() OVER() in HSQLDB using ROWNUM()
  • Let generated interfaces extend Serializable
  • Clarify the lifecycle of Configuration.data in the Javadoc
  • Generate more meaningful Javadoc where "an uncommented item" stands now
  • Add documentation to the FOR UPDATE OF clause, indicating that DB2 may have stricter requirements regarding updatability of fields
  • Add support for the H2 MERGE syntax - GitHub Issue #18
  • Simulate the H2 MERGE syntax in other dialects supporting
  • the SQL standard MERGE statement - GitHub Issue #18
  • Website and Documentation anchors should be links to themselves, visually recognizable/

New in jOOQ 2.3.1 (May 11, 2012)

  • #1334 - Fix inaccurate simulation of TRUNC(number, decimals) for Derby
  • #1403 - Documentation bug: ctx.statement() can be replaced in executeStart(). This is not documented
  • #1406 - Compilation errors in generated source code when Postgres stored procedure parameter is called "NAME"
  • #1407 - Compilation errors in generated source code when Postgres data-type is "any" (with quotes!)
  • #1409 - Postgres code generation broken when not connecting with the owner of a schema

New in jOOQ 2.3.0 (May 7, 2012)

  • Features and improvements:
  • Add support for Oracle KEEP (DENSE_RANK FIRST...)
  • aggregate function clause
  • Add ExecuteListener extension to allow for overriding
  • exception translator to handle vendor-specific error
  • codes
  • Add "renderSchema" flag to Settings, to completely
  • disable rendering of schema names
  • Generate setter methods for JAXB annotated configuration
  • properties
  • Add support for MySQL's INSERT IGNORE clause
  • imulate the FOR UPDATE clause for SQL Server, CUBRID,
  • using JDBC's ResultSet.CONCUR_UPDATABLE
  • Add Factory.inline() to allow for flagging inline-only
  • "bind values"
  • Add connection-less Factory constructors for convenience,
  • when jOOQ is only used as a SQL query builder
  • Add option to generate JSR-303 @NotNull and @Size
  • annotations to generated POJO's
  • Let HSQLDB dialect render NVL2() as NVL2() instead of
  • CASE expression
  • Allow for omitting , and generate all
  • available schemata in that case
  • Let generated factories use their associated Schema as
  • the Settings' RenderMapping's defaultSchema
  • Move jooq-spring's FactoryProxy to the core jooq project
  • Add Factory.dateAdd() and timestampAdd() for convenience
  • Add DataType.isLob()
  • Add Field inline(char), inline(Character),
  • inline(CharSequence) for convenience
  • Add support for the Oracle TRUNC function, for numeric
  • arithmetic
  • Let Record.into(Class) and similar methods accept
  • "immutable" classes, i.e. setter-less classes that take
  • several constructor arguments
  • Use Constructor.setAccessible(true), if no default
  • constructor is available on the target type of
  • Record.into(Class)
  • Improve Javadoc on Factory.function(). Document arguments
  • Add support for the CUBRID Click-Counter INCR()
  • Allow for creating syntax-error and SQL-injection safe
  • qualifiers for org.jooq.Field and org.jooq.Table
  • Add Factory.batchStore(TableRecord...), to allow for
  • batch UPDATE/INSERTs of many records
  • Make configured ExecuteListeners default constructors
  • accessible
  • Let org.jooq.Batch extend Serializable
  • Upgrade internal jOOR dependency to jOOR 0.9.3
  • Upgrade internal jOOU dependency to jOOU 0.9.1
  • Add RenderContext.qualify() to indicate whether
  • QueryParts should render qualified versions of themselves
  • or not
  • Features and improvements (jOOQ Console):
  • Upgrade jOOQ Console dependency on RSyntaxTextArea from
  • 1.5 to 2.0.2
  • Allow for filtering incoming statements in jOOQ Console
  • Implement a communication protocol between Console server
  • types and Console client types to allow for more
  • sophisticated functionality
  • API changes (backwards-compatible):
  • Deprecate Factory.literal() in favor of Factory.inline(),
  • and Factory.field()
  • Promote AbstractQuery.isExecutable() to the public API
  • Bug fixes:
  • INSERT and UPDATE statements always render non-qualified,
  • escaped field names. This may cause trouble when using
  • plain SQL fields
  • Standalone TABLE or VARRAY types are not correctly
  • initialised before referencing tables load them
  • NullPointerException when leaving empty
  • The LIKE escape character needs escaping, too, in
  • contains(), startsWith(), endsWith()
  • Add missing INTERVAL data types to HSQLDBDataType
  • Oracle's DataTypeDefinition reports the length of a BLOB
  • / CLOB data type to be 4000
  • and match only table names, not
  • fully qualified names
  • Add support for byte[] in Postgres UDTs
  • Code generation error in Oracle 10g when generating
  • stored procedures
  • Error when deserialising BLOBs from Oracle UDTs
  • NullPointerException when passing null to
  • timestampDiff(Field, Field)
  • Regression in insertInto(...).values(...). Cannot pass
  • Field to values()
  • Initialise Result ArrayLists to their expected size, if
  • that size is known.
  • jOOR issue 12: "Don't reset the accessible flag to false,
  • if setting it to true is required, to avoid race
  • conditions in concurrency contexts"
  • Missing conversion when using unsafe Field types in
  • BATCH statements
  • Oracle UDTs in REF CURSORs are not deserialised correctly
  • from procedure OUT parameters
  • Oracle UDTs are not deserialised correctly when the same
  • UDT name is present in multiple schemata
  • NullPointerException when omitting element in
  • code generation configuration

New in jOOQ 2.2.2 (Apr 23, 2012)

  • Oracle's DataTypeDefinition reports the length of a BLOB / CLOB data type to be 4000
  • Code generation error in Oracle 10g when generating stored procedures
  • NullPointerException when passing null to timestampDiff(Field, Field)
  • Regression in insertInto(...).values(...). Cannot pass Field to values()
  • NPE at org.jooq.util.AbstractDatabase.getOutputSchema()

New in jOOQ 2.2.1 (Apr 13, 2012)

  • Bug fixes:
  • Remove oracle.sql dependency also from OSGi information in pom.xml
  • SQL syntax errors from sequences when using RenderMapping with defaultSchema
  • DefaultBindContext logs as Util.class
  • Compilation error in CUBRID generated artefacts referencing OBJECT types
  • Avoid source code generation errors when generating code for unknown, dialect-specific data types

New in jOOQ 2.2.0 (Apr 10, 2012)

  • Features and improvements:
  • 566 - Add support for INTERVAL data types
  • 585 - Add support for DATE, TIME and INTERVAL arithmetic
  • 1183 - Add support for DEFAULT values in Oracle stored procedure
  • parameters
  • 1243 - Let generated POJOs (and Records) extend base classes
  • and implement interfaces
  • 1252 - Avoid JDBC escape syntax for Oracle stored procedure
  • calls. Generate PL/SQL syntax, instead
  • 1255 - Let generated Tables contain a public default constructor
  • to be able to extend those classes - Github issue 12
  • 1257 - Add CUBRID support
  • 1268 - Add Factory.field(String, QueryPart...) to generate
  • custom clauses
  • 1269 - Add YEAR(), MONTH(), DAY(), HOUR(), MINUTE(), SECOND()
  • function support as shortcuts for EXTRACT()
  • 1273 - Simulate GROUP_CONCAT() aggregate function using Oracle's
  • LISTAGG() function, where available
  • 1274 - Add support for the Oracle LISTAGG(...) WITHIN GROUP
  • (ORDER BY ..) [ OVER (..) ] aggregate / analytic function
  • 1275 - Simulate Sybase LIST() aggregate function using Oracle's
  • LISTAGG() function
  • 1276 - Simulate Oracle's LISTAGG() in DB2 using XMLAGG(),
  • SUBSTR() and CONCAT()
  • 1278 - DEBUG log both executed SQL and SQL with inlined bind
  • values
  • Bug fixes:
  • 1241 - Wrong variable binding when comparing CHAR columns in
  • Derby and DB2 without explicit casting to VARCHAR
  • 1244 - Cannot override class name in GeneratorStrategy in
  • Mode.POJO
  • 1248 - Setting both false and
  • true leads to compilation errors
  • 1256 - Fixed code generation issue with H2 user defined
  • functions returning VARCHAR
  • 1263 - Pass fetchsizes

New in jOOQ 2.1.0 (Mar 19, 2012)

  • Features and improvements:
  • #161 - Add runtime configuration to pretty print rendered SQL
  • #349 - Add SQLite relations support
  • #491 - Add runtime configuration for SQL keyword style (upper
  • case, lower case)
  • #521 - Add runtime configuration for SQL reference style (upper
  • case, lower case, as-is, quoted)
  • #1150 - Add code generation option to disable generation of
  • records
  • #1181 - Add support for SQL Server data types timestamp and
  • rowversion
  • #1188 - Load default Settings from the classpath at
  • /jooq-settings.xml, or from -Dorg.jooq.settings
  • #1193 - Specify main-class in jOOQ Console's manifest.mf and
  • include dependency in jar file
  • #1194 - Add ColumnDefinition.isNullable()
  • #1202 - Add support for the relational division operation:
  • A.divideBy(B).on(A.ID.equal(B.A_ID)).returning(A.X, ...)
  • #1207 - Add Factory.batch(Collection

New in jOOQ 2.0.5 (Feb 27, 2012)

  • Execute listener and SQL tracing support. jOOQ allows you to
  • hook your own listeners into jOOQ's query execution engine to
  • be notified of all sorts of events
  • The existing SchemaMapping features. They are now part of the
  • runtime configuration
  • StatementType settings. Specify whether a Factory should
  • execute java.sql.PreparedStatements (with bind variables) or
  • static java.sql.Statements with inlined variables.

New in jOOQ 2.0.4 (Feb 13, 2012)

  • Maven and standalone code generation now use the same XML
  • configuration, which is read by jOOQ-codegen using JAXB. This
  • allows for more complex configuration elements in the future
  • jOOQ-codegen can now handle multi-schema databases and generate
  • code for tables referencing tables from other schemata. This
  • is integration tested against the SQL Server AdventureWorks
  • database
  • jOOQ now allows to generate simple POJOs in addition to Records
  • and to annotate both POJOs and Records with JPA annotations
  • such as @Entity, @Table, @Id, @Column, @UniqueConstraint, etc.

New in jOOQ 2.0.3 (Jan 30, 2012)

  • Features and improvements:
  • #578 - Add KEY JOIN syntax to simulate joining using generated
  • foreign keys
  • #577 - Simulate NATURAL JOIN syntax, where this is unavailable
  • #582 - Simulate JOIN USING syntax, where this is unavailable
  • #671 - Allow for nesting JOIN clauses
  • #676 - Add Table.join() methods to create more flexible table
  • sources
  • #993 - Add Field.equalAny(T[]), .equalAny(Field) methods
  • #1048 - Simulate (array) syntax for dialects
  • that do not support arrays
  • #1051 - Add Factory.execute(String, Object...) as a convenience
  • method for Factory.query(...).execute()
  • #1055 - Simulate Factory.table(Object[]) and table(List) using
  • UNION ALL in dialects that do not support arrays
  • #1060 - Improve debug logging of H2 arrays. The syntax is not
  • ARRAY[1, 2], but (1, 2)
  • #1065 - Add OracleFactory.sysContext(String, String) to support
  • Oracle's SYS_CONTEXT function
  • #1069 - Add support for INSERT INTO table(field1, field2, ...)
  • SELECT syntax - as opposed to the existing INSERT INTO
  • table SELECT
  • #1072 - Add support for LIKE .. ESCAPE .. syntax
  • #1074 - Add Field.notBetween(T, T) for convenience
  • #1080 - Add support for JDBC's Statement.setFetchSize() in
  • ResultQuery.fetchLazy()
  • #1082 - Add some more DEBUG logging in AbstractResultQuery
  • API changes (backwards-compatible):
  • #1059 - Change SelectFromStep.from(Collection>)
  • API changes (backwards-incompatible):
  • #1087 - Change the NTILE function to return Field
  • instead of Field
  • Bug fixes:
  • #1071 - Make Sequence Serializable
  • #1081 - Derby error in NULL handling when simulating unnested
  • arrays that contain NULL values
  • #1084 - Bind index mismatch in val(null).equal(null) and in
  • val(null).notEqual(null)
  • #1091 - Add missing @Support annotations on Table.crossJoin()
  • methods
  • Test cases:
  • #1026 - Add integration tests for NTILE window function and
  • document compatibility
  • #1073 - Add integration tests for NOT IN queries holding NULL
  • arguments

New in jOOQ 2.0.2 (Jan 9, 2012)

  • The whole jOOQ API is now annotated with a new org.jooq.Support
  • annotation to help you assess whether a certain SQL clause is
  • available in your database or not. This is particularly useful
  • when your application should support several databases at once
  • (e.g. MySQL, Postgres, Oracle)
  • The Oracle PIVOT clause is now formally supported for advanced
  • statistical queries in Oracle. This clause will be simulated in
  • other dialects in the future.
  • The DATE data type can be mapped to TIMESTAMP. This important
  • when you query a legacy Oracle database, where DATE columns
  • can also contain time information
  • Several convenience methods have been added for more fluent
  • syntax, when using plain SQL result queries, subqueries as
  • tables, or when unnesting arrays in ANY() and ALL() quantifiers

New in jOOQ 2.0.1 (Dec 27, 2011)

  • Features and improvements:
  • #691 - Add support for Oracle CURSOR REF IN / INOUT parameters
  • #677 - Add type-mapping configuration, enforcing types for
  • columns
  • #947 - Add custom type mapping support (experimental)
  • #968 - Allow for custom enum types, configured in the code
  • generator (experimental)
  • #974 - Add Schema.getTable(String), getSequence(String),
  • getUDT(String) for better runtime Schema meta-navigation
  • #975 - Add Sequence.getName(), getSchema(), getDataType()
  • #980 - Add support for named parameters, to better interact with
  • Spring
  • #991 - Add Query.bind(String, Object) and bind(int, Object) to
  • easily modify existing bind values
  • #992 - Document thrown DataTypeException in Convert methods
  • #998 - Enhance MERGE statement for Oracle extensions:
  • WHEN MATCHED THEN UPDATE .. WHERE .. DELETE WHERE ..
  • WHEN NOT MATCHED THEN INSERT .. WHERE ..
  • #1000 - Add support for MySQL's INSERT INTO .. SET .. syntax in
  • MERGE statement's WHEN NOT MATCHED THEN INSERT clause
  • API changes (backwards-compatible):
  • #981 - Cannot insertInto(table("my_table")), as plain SQL tables
  • return Table, not Table. Relax
  • bound on R
  • #988 - Change Factory.field(String) to return Field
  • instead of Field
  • #999 - Make MERGE's WHEN MATCHED .. and WHEN NOT MATCHED ..
  • clauses optional
  • #1001 - Identity.getField() should return TableField
  • instead of Field
  • #1006 - Add Factory.value(...) as a synonym for Factory.val(...)
  • for increased Scala / Groovy compatibility
  • Bug fixes:
  • #973 - EnumType renders name() instead of getLiteral() in
  • formatXXX() methods
  • #977 - EnumType renders name() instead of getLiteral() in
  • Convert.convert() method
  • #979 - Record.from() sets all changed flags to true. That's not
  • necessarily correct in the event of storing the record
  • back to the DB
  • #985 - AbstractRecord.equals() does not correctly compare
  • arrays. Compare them using Arrays.asList()
  • #986 - Postgres / DB2 / Sybase ASE foreign-key namespace is
  • unique-per-table. jOOQ forces all foreign keys from all
  • tables into the same namespace
  • #990 - Problems when encoding arbitrary byte[] as String(byte[])
  • in inlined SQL. This can cause issues when DEBUG-level
  • logging is activated
  • #995 - Routines don't respect SchemaMapping - Github issue #8
  • #1002 - TableRecord.storeUsing() doesn't update IDENTITY column
  • values, if the column is not part of the main unique key
  • #1003 - Sybase / SQL Server / MySQL / Ingres / H2 / Derby's
  • INSERT .. RETURNING simulation returns null if a table
  • has an IDENTITY column, but no primary/unique key
  • #1005 - The INSERT INTO .. VALUES .. syntax may cause type-safety
  • issues in some databases. VALUES should be converted
  • before binding

New in jOOQ 1.7.0 (Nov 26, 2011)

  • #925 - SelectConditionStep should extend SelectConnectByStep, not
  • SelectGroupByStep
  • #926 - AbstractRecord.into() fails to convert java.sql.Date into
  • java.util.Date
  • #937 - In the event of name clash (same name for table and field)
  • generated code has errors
  • #945 - Calling UpdatableRecord.setValue() twice with the same
  • argument causes the changed flag to be reset to false
  • #948 - Always set the changed flag to true in Record.setValue()
  • #951 - Empty Password for jooq-codegen-maven causes NPE

New in jOOQ 1.6.9 (Nov 14, 2011)

  • Features and improvements:
  • #621 - Add support for JDBC batch operations
  • #794 - Add support for ORDER BY [int value] in order to reference
  • a column index for sorting
  • #882 - Optimise Field.isTrue() and isFalse(). Take Field's data
  • type into consideration.
  • #885 - Add support for INSERT INTO .. VALUES (..) syntax,
  • omitting explicit field declarations
  • #887 - Add List Cursor.fetchInto(Class)
  • Bug fixes:
  • #748 - H2 regression in 1.3.158 regarding stored functions, which
  • return a ResultSet (this was fixed in H2)
  • #859 - Derby casting of numeric types to BOOLEAN doesn't work
  • #886 - Regression in date extract function when used in a
  • subselect
  • #888 - Derby casting of VARCHAR to FLOAT (and similar) doesn't
  • work

New in jOOQ 1.6.8 (Oct 24, 2011)

  • Features and improvements:
  • #271 - Don't pre-fetch table meta data when selecting from plain
  • SQL tables
  • #489 - Add support for SELECT * (i.e. render SELECT * where
  • applicable)
  • #596 - Add support for VARIANCE() and STDDEV() OVER() window
  • functions
  • #608 - Add jOOQ version number in generated source code
  • #670 - Add more Javadoc to Field.xxx() functions
  • #692 - Add support for ResultSet type returned from HSQLDB
  • stored functions
  • #850 - Use http://www.jooq.org as URL for the @Generated
  • annotation
  • #854 - Add convenience methods Fields.isTrue(), isFalse() for
  • conversion of "Y", "YES", "1", "true", "on", etc into a
  • boolean condition
  • #870 - Add support for MEDIAN aggregate function
  • #872 - Add support for STDDEV_POP(), STDDEV_SAMP(), VAR_POP(),
  • VAR_SAMP() aggregate functions
  • #874 - Reduce the number of internal classes for dialect-specific
  • function aliases
  • #878 - Implement DataType.equals() and hashCode()
  • API changes (backwards-compatible):
  • #851 - Change Field.{sortAsc|sortDesc}(List sortList) into
  • Field.{sortAsc|sortDesc}(Collection sortList)
  • API changes (backwards-incompatible):
  • #848 - Purge deprecated API - Prior to 1.6.1
  • #849 - Replace Cursor.fetchResult() by Cursor.fetch()
  • #852 - Review stored procedures / functions concept. Merge them
  • all into a single "Routine" type
  • Bug fixes:
  • #756 - Error when aliasing HSQLDB and Postgres unnested tables
  • #761 - Exception when TRACE logging execution with plain SQL
  • tables involved
  • #773 - Execute standalone stored functions as CallableStatement
  • to prevent issues with transactions
  • #847 - Query.getSQL() doesn't render dialect-specific SQL when
  • Query is constructed using the fluent API
  • #853 - DB2 generated convenience methods for stored functions
  • have unstable ordering
  • #857 - Derby casting of numeric types to String / VARCHAR does
  • not work
  • #858 - SQLDataType.getSQLDataType() should return itself, instead
  • of null
  • #860 - SQLite CEIL function is incorrectly simulated. CEIL(2.0)
  • returns 3.0 instead of 2.0
  • #861 - Field.replace(String) generates bad SQL for various RDBMS.
  • Field.replace(String, String) works, though
  • #863 - Ingres integration generates illegal SQL when selecting
  • things like SELECT 1 WHERE 1 = 1
  • #866 - Sybase ASE Field.replace(String) function incorrectly
  • removes the argument string
  • #873 - Error when selecting two times the same aggregate field
  • #877 - Compilation error in generated source code when a table
  • without a primary key has an identity column
  • #879 - Add Google Cloud SQL Example
  • #880 - Query.getSQL() does not consider SchemaMapping
  • Test cases:
  • #811 - Loader integration tests fail for SQLite
  • #812 - CSV Loader test leaves Postgres JDBC connection in an
  • inconsistent transactional state on error
  • #856 - Add integration tests for Field.abs()
  • #865 - Add integration tests for Field.ascii()
  • #867 - Add integration tests for Field.sum(), avg(), max(), min()
  • #881 - Re-design H2 stored functions to be pre-compiled, in order
  • to speed up integration tests

New in jOOQ 1.6.7 (Sep 26, 2011)

  • Features and improvements:
  • 797 - Create Maven plugin for source code generation
  • 825 - Add List Factory.fetchMany(String) to
  • allow for fetching several result sets from stored
  • procedures, such as Sybase ASE's "sp_help"
  • 838 - Implement MetaDataFieldProvider.toString()
  • 841 - Add List Result.getValues(Field, Class)
  • 842 - Add Query.getBindValues() method to allow for extracting
  • bind values in the correct order
  • 843 - Add Factory.fetch(ResultSet) to transform a JDBC ResultSet
  • into a jOOQ Result
  • API changes (backwards-compatible):
  • 837 - Avoid final keyword on Object methods, such as .equals(),
  • .hashCode(), etc
  • Bug fixes:
  • 836 - Bad syntax when selecting from aliased plain SQL tables
  • 839 - Boolean conversion in getValueAsBoolean() should trim
  • String values first
  • 840 - Numeric conversions in getValueAsXXX() should trim String
  • values first
  • 844 - NullPointerException when selecting a column from a Result,
  • that does not exist

New in jOOQ 1.6.6 (Sep 13, 2011)

  • Features and improvements:
  • #796 - Complete missing public org.jooq.impl Javadoc
  • #800 - Add support for Sybase Adaptive Server Enterprise
  • #808 - Add support for INSERT .. RETURNING for Ingres
  • #809 - Add support for INSERT .. RETURNING for Sybase SQL Anywhere using SELECT @@identity
  • #810 - Add support for INSERT .. RETURNING for SQLite using last_inserted_rowid()
  • #813 - Add DSL support for INSERT .. RETURNING
  • #814 - Change TableRecord to reload its trigger-initialised main key in Oracle and other RDBMS that don't support IDENTITY columns
  • #818 - Add SQLiteFactory.rowid()
  • #819 - Support SQLite AUTOINCREMENT columns as IDENTITY
  • #820 - Add Factory.fetchOne(String) for executing plain SQL queries that return single records
  • #826 - Allow for returning several records in the INSERT .. RETURNING clause. This now works for DB2, HSQLDB, MySQL, and Postgres
  • #827 - Support Sybase SQL Anywhere's TOP n START AT m clause instead of simulating it with nested SELECT's
  • API changes (previous API now deprecated):
  • #817 - Deprecate Factory.lastID(Identity)
  • Bug fixes:
  • #815 - SQL Server fetching of IDENTITY value is broken
  • #821 - Optimise ResultQuery.fetchAny() executing fetchLazy() internally, and only fetching one record from the cursor
  • #822 - Let Constant cast to more precise NUMERIC/DECIMAL types in those RDBMS where casting is necessary
  • #823 - Cannot bind SQLite BigDecimal, BigInteger types - bind them as String instead
  • #824 - BigInteger values cannot be bound in DB2, Derby
  • #828 - Document inefficient implementation for GREATEST and LEAST in some RDBMS

New in jOOQ 1.6.5 (Aug 29, 2011)

  • 784 - Add Result.exportXML() to retrieve a DOM document similar
  • to that of .formatXML()
  • 792 - Add support for loading of CSV data into tables
  • 795 - Add List fetch(int, Class) and
  • fetch(String, Class) convenience methods
  • 803 - Add support for INSERT .. RETURNING or simulate it where
  • not available
  • 805 - Add T[] fetchArray(int, Class) and
  • fetchArray(String, Class) convenience methods
  • 806 - Add T fetchOne(int, Class) and
  • fetchOne(String, Class) convenience methods
  • Bug fixes:
  • 798 - Oracle IN (...) clause with more than 1000 arguments does
  • not work
  • 802 - Use "INSERT .. RETURNING" instead of "SELECT MAX(pk)"
  • to retrieve the primary key of a new record

New in jOOQ 1.6.4 (Aug 8, 2011)

  • Features and improvements:
  • #137 - Add support for asynchronous query execution using
  • FutureResult ResultQuery.fetchLater() similar to
  • Avaje Ebean
  • #198 - Add SELECT INTO functionality into POJO's using
  • T ResultQuery.fetchInto(Class) similar to JPA
  • CriteriaQuery
  • #728 - Add .fetchInto(RecordHandler) to ResultQuery, Result,
  • and Cursor to allow for callbacks similar to Spring's
  • JdbcTemplate/Ollin Framework
  • #774 - Add more TRACE logging to .fetchLazy()
  • #777 - CURSOR: Add function alias: UNNEST for TABLE
  • #781 - Add E function (Euler number)
  • #782 - Add T Record.getValue(..., Class

New in jOOQ 1.6.3 (Jul 25, 2011)

  • Features and improvements:
  • #679 - Improve H2 NVL2 support as of H2 1.3.156
  • #680 - Improve H2 ROUND support as of H2 1.3.156
  • #735 - Add README documentation to GitHub
  • #736 - Add more info regarding number of generated artefacts in
  • jooq-codegen logging
  • #750 - Add DataType.isNumeric(), .isString(), .isTemporal(),
  • .isBinary()
  • #754 - Log query as executed by JDBC PreparedStatement when
  • TRACE logging (without inlining variables)
  • #752 - CURSOR: Add support for selecting from ARRAY types
  • #762 - Use H2's native support of NVL, instead of COALESCE
  • #764 - CURSOR: Add support for selecting from ARRAY types
  • returned from stored functions
  • API changes (backwards-incompatible):
  • #639 - Map DECIMAL(n, 0) and NUMBER/NUMERIC(n, 0) data types
  • to Byte/Short/Integer/Long/BigInteger instead of
  • BigDecimal in generated source code. Re-generated code
  • will not be compatible!
  • API changes (backwards-compatible):
  • API changes (previous API now deprecated):
  • #731 - Inconsistent API with Field.lessOrEqualToXXX(). Removed
  • "To" from method name
  • #757 - Deprecate Factory.constant() methods
  • Test cases:
  • #731 - Add missing integration tests for equalAll(), equalSome()
  • and similar methods
  • #747 - Upgrade H2 to 1.3.158
  • Bug fixes:
  • #632 - Sybase error : column @p0 not found in nested SELECT
  • #700 - Restore HSQLDB ARRAY support with INFORMATION_SCHEMA
  • change in HSQLDB 2.2.3, and some fixes in 2.2.5
  • #725 - Cannot insert byte[] data with plain SQL
  • #733 - H2 changed JDBC type for ResultSet/CURSOR from 0 to -10,
  • like Oracle
  • #737 - Compilation errors in generated source code if table
  • fields contain spaces
  • #738 - Compilation errors in generated source code if MySQL
  • procedure parameter type contains two comma-separated
  • arguments (like DECIMAL(10,2))
  • #739 - Postgres navigator methods and keys are not re-generated
  • in the same order
  • #740 - Formatting is broken on Result.format() with some special
  • newline characters
  • #743 - Make SQL Server INFORMATION_SCHEMA independent from
  • HSQLDB again, to prevent incompatibility issues
  • #744 - Ingres REAL and FLOAT4 types are generated as FLOAT/FLOAT8
  • which maps to java.lang.Double, instead of java.lang.Float
  • #753 - Postgres error when binding array that contains null
  • values
  • #755 - NullPointerException when converting an array containing
  • a null value
  • #766 - Bad decoding of JDBC Types BIGINT (to BigInteger instead
  • of Long) and REAL (to BigDecimal instead of Float) when
  • plain SQL tables are involved

New in jOOQ 1.6.2 (Jul 11, 2011)

  • Features and improvements:
  • #61 - EXPORT: Add Result.formatXML()
  • #166 - CURSOR: Add support for ResultSet type returned from Oracle stored procedures / functions
  • #411 - Allow for fetching Map (instead of Record) and List (instead of Result)
  • #549 - Add Factory.function() for plain SQL functions
  • #611 - Simulate RPAD and LPAD in SQL Server, Sybase
  • #627 - Add support for Postgres FOR UPDATE OF [table-name] clause
  • #628 - Add support for REPEAT (SQL Server: REPLICATE) function
  • #637 - Nicely format time in StopWatch logging output
  • #640 - Simulate Postgres FOR UPDATE OF [table-name] clause in other dialects
  • #649 - CURSOR: Add Cursor.fetch(int) .fetchOne() .fetchResult(int) .fetchResult()
  • #653 - Add support for MySQL encryption and compression functions
  • #660 - Clarify Javadoc of UpdatableRecord to explain its behaviour when changing the main unique key
  • #669 - EXPORT: Add Result.formatHTML()
  • #672 - Add convenience method UpdatableRecord.copy() in order to reset primary key values for a subsequent INSERT
  • #675 - EXPORT: Add Result.formatCSV()
  • #683 - Implement ResultImpl.equals() and .hashCode()
  • #684 - Implement AbstractStore.equals() and .hashCode()
  • #685 - Add Store.size() to indicate the maximum index of the Store
  • #687 - EXPORT: Add result.formatJSON()
  • #689 - Create separate builds: jooq-core.zip and jooq-with-dependencies.zip
  • #690 - CURSOR: Add support for ResultSet type returned from H2 stored functions
  • #695 - CURSOR: Add support for ResultSet type returned from Postgres stored functions
  • #697 - Add Factory.fetch(String) for executing plain SQL queries that return results
  • #701 - Add ResultQuery.fetchArray() and .fetchOneArray to return Object[][] and Object[]
  • #704 - Always add top and bottom line in Result.format()
  • #705 - Right-align numeric values in Result.format()
  • #716 - Add SUBSTRING function Field.substring(Field, Field) taking fields as arguments
  • #719 - Document risk of SQL injection in plain SQL and literal factory methods
  • #726 - Add LENGTH function as a synonym for CHAR_LENGTH
  • API changes (backwards-compatible):
  • #698 - Inconsistent API with Factory.fetch(Table [,Condition]) Let method return Result instead of List
  • #699 - Let Result extend List
  • API changes (previous API now deprecated):
  • #656 - Decrease verbosity of plain SQL methods. They will just be called Factory.field() .condition() .table() .query()
  • Test cases:
  • #643 - Add integration test for code generation of invalid and incomplete types in Oracle
  • #654 - Add integration tests for master data tables with PK types other than NUMBER/INT
  • #655 - Add missing integration tests for TRIM function
  • Bug fixes:
  • #450 - Improve plain SQL integrity checks for bind variables
  • #610 - CODEGEN: Compilation error in generated source code for databases with table named 'system'
  • #646 - An empty Java package is generated for an empty PL/SQL package. This is unnecessary
  • #651 - CODEGEN: Avoid importing datatypes in generated source code to prevent collisions
  • #657 - NullPointerException when creating a Factory with a null SchemaMapping
  • #658 - Master data table code generation is broken for tables with more or less than 3 columns
  • #662 - Add support for the missing Postgres data type "bpchar"
  • #663 - Add support for the missing Sybase data type "int"
  • #664 - Ingres INTEGER data types are not correctly generated
  • #665 - HSQLDB Datatype CLOB and BLOB are not supported, when selecting from plain SQL tables
  • #666 - The evil bug: Ingres TRIM function only executes RTRIM
  • #673 - UpdatableRecord.store() doesn't work if called after .delete()
  • #702 - Add support for the missing SQLite data type "NULL"
  • #706 - CURSOR: Ensure that Query.execute() runs in a single transaction when Postgres refcursor is involved in the query (this fixes a Postgres JDBC driver flaw)
  • #724 - NullPointerException when passing a single literal null bind value to plain SQL methods without casting to Object
  • #729 - DB2, Derby, Ingres, Oracle cannot bind null values in plain SQL

New in jOOQ 1.6.1 (Jun 27, 2011)

  • Features:
  • #351 - Add support for Oracle ROWID data type
  • #452 - PORTABILITY: Create a super-set of RDBMS data types
  • #453 - PORTABILITY: Don't create dialect-specific QueryParts
  • #455 - Add support for the Oracle CONNECT BY clause
  • #587 - Add optional OFFSET clause to form LIMIT .. OFFSET constructs
  • #589 - Add extended FOR UDPATE [OF ...] [{WAIT n | NOWAIT | SKIP LOCKED }] support
  • #591 - Add support for LEAD() OVER() and LAG() OVER() window functions
  • #592 - Add support for the CUME_DIST() OVER() window function
  • #601 - Add Factory.literal() convenience methods
  • #602 - Add Factory.val() methods to decrease .constant() verbosity
  • #604 - Add support for RESPECT NULLS clause in some window functions
  • #605 - Add Factory.use(String) for non-generated schemata
  • #613 - Add PI function
  • #616 - Add Factory.two() literal convenience method
  • #630 - Add support for Oracle CONNECT BY pseudo-columns LEVEL, CONNECT_BY_ISCYCLE, CONNECT_BY_ISLEAF
  • API changes:
  • #299 - PORTABILITY: Create a dialect-independent meta-model
  • #588 - Add OVER() keyword to FIRST_VALUE() and LAST_VALUE() API
  • Test cases:
  • #368 - Add integration test for use with schema mapping
  • #586 - Upgrade H2 to 1.3.155
  • #607 - Add integration tests for CRUD / SP's / UDT's / ARRAY's with SchemaMapping
  • #612 - Add integration tests for LPAD and RPAD functions
  • #624 - Add integration test for code generation of invalid/ incomplete views in Oracle
  • #631 - PORTABILITY: Add integration tests for using Oracle- generated schema against an HSQLDB database
  • #638 - Add missing integration test for DECIMAL data type
  • Bugfixes:
  • #176 - Stored procedures / functions in EQUIVALENT schemata cannot be called
  • #493 - Bind variable mismatch when constructing bad SQL
  • #594 - Confusing Javadoc in SELECT DSL API
  • #603 - Fix DB2 'IGNORE NULLS' clause
  • #619 - SUBSTRING() function is broken in DB2, Ingres, SQL Server
  • #623 - SQL syntax error for some MERGE queries in SQL Server and Sybase
  • #633 - SchemaMapping is not applied to sequences
  • #634 - Sequences are not escaped in generated SQL