Infrastructure:
- Gradle 6.5. Thanks to KushalP
Features:
- New composite column type to create complex mappings to multiple columns.
- Money column type and a new
exposed-moneymodule. This and above were implemented by encircled - Duration column type (
exposed-java-timemodule only) provided by CommanderTvis Transaction.execfunctions accept list of parameters. PR by uuf6429.- [H2] Native
REPLACEinstead ofINSERT... ON DUPLICATE UPDATEby pilotclass. - Other unsigned types: ubyte, ushort, uint added by kenta.koyama.
- Index type support added by ryanpbrewster.
Bug Fixes:
- Upgrading from 0.17.7 to 0.25.1 leading to overload resolution ambiguity, created
Database.connectPool(#938 - Impossible to refresh entity created via new(id: ID?, ...) (#925), PR by socar-bad
- Concat function should accept any expression not only strings. PR by palevomr.
- Irregular order of operands in generated CHECK constraint (#920)
- [SQLite] allow NOT NULL modifier for PK column. Fixed by hichem-fazai.
SchemaUtils.createMissingTablesAndColumnsfails with references (#866, #934, #952). Fixed by jschmid.
Features:
- UNSIGNED LONG column support (PR by kenta.koyama)
shouldReturnGeneratedValuesparam added to batchInsert function and statement. Useful whenreWriteBatchedInsertsenabled.- Eager loading for text columns / H2: column of 'text' type requires open transaction even if it was already read successfully (#848)
Bug Fixes:
- Problem with suspended transaction functions and spring transaction manager
- Using blocking transactions after a suspending transaction causes a "Connection is closed" exception
- SQLite driver name does not recognize correctly (#905)
- limit(0) doesn't work (#845)
- Ignore missing fields instead of crashing
- DatabaseDialect.modifyColumn doesn't work for H2 (#911)
- ClassCastException when using selectBatched with integer autoinc table (PR by DarkXanteR)
- ResultSet & Statement leaks in simple query (#871) / Possible fix for not closed inputStreams.
Infrastructure:
- Kotlin 1.3.72
- Kotlin Coroutines 1.3.5
- MariaDB driver 2.6.0
- MySQL drivers 5.1.49 and 8.0.20
- Oracle driver replaced from Atlasian fork (12.1.0.1) to original 12.2.0.1
- PostgreSQL driver 42.2.12.jre6
- PostgreSQL NG driver 0.8.4
- SQLServer driver 8.2.2.jre8
- SQLite driver 3.31.1
Features:
- A lot of improvements on working with
Schema(checking for existence, additional parameters like password, defaultTablespace, etc). Thanks a lot to hichem-fazai. CHAR(N)column type support (#858).BYTEcolumn type support (PR #876 from spand).timestampParam,timestampLiteralandCustomTimeStampFunctionadded by spand (PR #876).- Support for
javax.sql.ConnectionPoolDataSourceinDatabase.connect(#902) - Allow to provide transactionIsolation level on newSuspendedTransaction/suspendedTransactionAsync
Bug fixes:
- No need to provide explicit transaction isolation level for SQLite and Oracle
- [PostgreSQL] Exception when using jsonb question mark operator ('?') (#890 fixed by qoomon)
- [Spring Boot]
NoUniqueBeanDefinitionExceptionthrown (#869) - Do not request generated key if no autoinc/sequence columns provided in an insert statement / reWriteBatchedInserts does not work with PostgreSQL (#881)
castToshould return the expression of exact type (#874)- DateTime problem with SQLite (using exposed.java-time) / Different amount of millis stored and restored (#823)
Code specific changes:
SqlExpressionBuilderClassdeprecated in favor to ISqlExpressionBuilder (PR #859 from Ali Lozano).equalsandhashCodeonColumnType(PR #860 from Ali Lozano).
Features:
- Schema support: create/set current/drop. Many thanks to hichem-fazai.
Bug fixes:
- Spring transaction doesn't close/commit transaction at the end of
transactionblock (#831). - SpringTransactionManager has connection leak when used with
transactioninstead of @Transaction annotation (#831). id not in record setwhen getting by id which alias to another column (#820).- Fixed
tableConstraintsretrieval fails for column names that need quoting fixed by t-kameyama, thank you (#839). - Fixed attempt to create the same foreign key constraint even if one already exists (#843).
Documentation on SQL functions was added by Juan José González Abril
Broken Changes:
- Return type of
SizedIterable.count()(andQuery.count()as an inheritor) was changed from Int to Long to support very large tables.
Also, offset parameter of SizedIterable.limit() and DeleteStatement functions were changed accordingly. limit parameter stays untouched to be in sync with Kotlin Collection.size
Features:
- New pgjdbc-ng driver for PostgreSQL supported with help of hichem-fazai
- Updates with joins supported (#671), (#636), (#671).
- Custom names for foreign keys supported by t-kameyama (#510).
- Support for
notInSubQueryexpression (#791), thanks for PR, dolgopolovwork. Database.connect()could be used without providing an explicit driver. It will be resolved from a connection url. Improvement provided by Ali Lozano.- Most of SQL operators can be called on Expressions instead of ExpressionWithColumnType #829
Bug fixes:
- Respect schema in JdbcDatabaseMetadataImpl.tableNames (#797).
- JavaLocalDateTimeColumnType not setting nanoseconds correctly on Timestamp (#793).
- Correct precedence for arithmetic operators (#788) fixed by toefel18.
- Default value was not generated in DDL for columns within a primary key (#810).
QueryAlias.get(original: Expression<T>)lose query's alias (#633).Query.copy()doesn't clone internal lists was fixed by Ali Lozano.- Unable to create entity with overridden equals method due to field initialization error (#806).
Public methods and classes of database dialects, tables and columns were covered with documentation by Juan José González Abril. Thanks a lot!
Features:
- Sequences support improved: added all parameters like startWith, incrementBy and other, nextVal expression. Thank you hichem-fazai for such great PR.
CustomOperatorintroduced to be used when you need to create an SQL operator. PR from gelineau.SchemaUtils.createDatabaseandSchemaUtils.dropDatabaseadded by hichem-fazai- GUID values could be stored in UUID columns (#767). Fixed by hichem-fazai.
Bug fixes:
- spring-configuration-metadata.json is not located inside exposed-spring-boot-starter.jar (#767)
- It wasn't possible to use
eqoperator on nullable entity id column and base column value (#748) java.lang.IllegalStateExceptionwas thrown when one table references to other by id column (#501)
Features:
sizeproperty added forColumnMetadata(#748). Thank you, kenta.koyama.
Bug fixes:
- Can't load implementation for DatabaseConnectionAutoRegistration (#748).
- Proper length check when using Unicode strings (#743). PR from pt2121, thank you.
- Custom enumeration not working with default value (#750)
- [SQLite] fixing a bug that happens when creating table with autoInc column and custom primarykey constraint name (#755). Fixed by hichem-fazai.
- Flushing a new entity fails with an exception (#761)
- Update event wasn't fired on Entity.flush() (#764)
Bug fixes:
- Predefined
IntIdTable/LongIdTable/UUIDTableshould respect deprecated primaryKey declaration.
Features:
- New way to define primary keys on tables were implemented by hichem-fazai to support custom primary key constraint keys.
If have to use
override val primaryKey: PrimaryKey?on your table if you want to define a custom name. For all users of predefinedIntIdTable/LongIdTable/UUIDTablenothing changed. OldColumn.primaryKeyfunction was depricated and will be removed in the future releases. java.time.Instantsupported withtimestampcolumn type (exposed-java-timemodule only) (#724). Many thanks to Lukáš Křečan.- Support for unsized binary columns (Oracle and PostgreSQL dialects) (#716). Another great PR from hichem-fazai.
- A unique identifier for
Transactioninstance introduced and supported in EntityHooks/EntityEvents by mpe85.
Bug fixes:
- Annoying
NoSuchElementExceptionfrom 0.19.3 fixed by Toshiaki Kameyama (#731) - Prevent defining duplicated column name in a table. Now you will get
DuplicateColumnExceptionat runtime (#709). Nice work hichem-fazai! batchInsertwill throwBatchDataInconsistentExceptioninstead ofNoSuchElementExceptionwhen it wasn't possible to make insertion (#741).
Deprecations:
Query.orderBy()functions with boolean sort parameter were removed
Bug fixes:
- NoSuchElementException: List is empty on updating not flushed entities (#708)
- Replace function fails on H2 in MySQL mode when using pool
- Delayed DAO update flush causes unique constraint violation (#717)
Query.empty()shouldn't add LIMIT 1 if query is marked as forUpdate() (#684)
Broken changes:
EntityID,IdTable,IntIdTable,LongIdTable,UUIDTableclasses fromexposed-corewere moved fromorg.jetbrains.exposed.daotoorg.jetbrains.exposed.dao.idpackage along withexposed-jodatimemodule classes to support Java 9 module system. To help with migration, old classes were deprecated with properreplaceWithoption. Read migration guide for more details.
Features:
selectBatchedandselectAllBatchedfunctions added to make queries in batches (#642). Many thanks to Pin-Sho Feng for a PR.- Added UpdateBuilder.update expression builder version (#700). Another useful PR from spand
- New SQL datetime functions year, day, hour, minute, second (#707). Helpful PR from hichem-fazai
Bug fixes:
- SpringTransactionManager doesn't properly rollback transactions in some cases (#666)
- Compilation error Field name 'Oracle12+' cannot be represented in dex format. (#668)
- Enable comparing(less/lessEq/greater/greaterEq) to nullable column (#694). Thank you Toshiaki Kameyama.
- Fixed insert statements with expression as a value.
- Do not load related entities multiple times when using eager loading with the same entities. Small but useful fix from kenta.koyama
- Failed on create a FK for a table created in another database schema (#701)
Major changes:
- New modules model. For more details please read dependencies section and migration guide in wiki.
- Java 8 Time API support
Deprecations:
- Remove deprecated Expression.toSQL
newSuspendedTransactionAsyncnow returnsDeferredinstead ofTransactionResult(which was removed completely)TransactionResult.andThenfunction was removed
Features:
Bug fixes:
- [Coroutines] newSuspendedTransaction captures outer transaction and then close it before return to outer block
- [Coroutines] IllegalArgumentException thrown when List<Deferred>.awaitAll() is used on List<TransactionResult> (#658)
- identifierLengthLimit should not be lazy initialized
- Immutable entities wasn't invalidated in some cases (#665). PR from Dmitry Dolzhenko.
- Rework resolving auto increment type to handle own ColumnType implementation (#663). PR from Mateusz Śledź.
- Fixing the
monthbuilt-in function in case of all database dialects (#670). PR from hichem-fazai - Compilation error Field name 'Oracle12+' cannot be represented in dex format. (#668)
- [SQLite] Problem with
autoIncrement()andprimaryKey(). (#649), (#669) - fixes in error logging of expressions.
Critical bug fix:
- Outer transaction wasn't restored after inner transaction failed on exception
Bug fixes:
- ORA-00972: identifier is too long. Oracle 11g (#654)
Features:
- shortParam/shortLiteral, floatParam/floatLiteral, doubleParam/doubleLiteral added (#648)
- Warmup for backReferences via
loadandwithfunctions was supported
Critical bug fix:
- Transaction isolation level wasn't applied to transaction
Critical bug fix:
andfunction executed onAndexpression mutates expression state
Features:
SchemaUtilsfunctions (create/createMissingTablesAndColumns/drop) could be executed withinBatchflag to perform related functions in a single batch (where possible)
Performance:
- Speed up scheme analysis within for MySQL in place where column constraints metadata is required
Infrastructure:
- Kotlin updated to 1.3.50
Features:
- Added
shortcolumn type support backed withSMALLINTSQL type - Added
greater/greaterEq/less/lessEqfunctions with EntityID parameter (#619)
Bug fixes:
- CURRENT_TIMESTAMP/NOW used as DEFAULT were broken for MySQL in some cases (#631. Thanks Saeed Shahrivari for initial PR.
Bug fixes:
- MySQL match function is broken
- notInList function doesn't work with list of EntityID. Thank you kenta.koyama for a PR.
Performance:
- QueryBuilder and Expression were reworked to lower object allocation when preparing SQL.
Important:
This version has a broken change: Expression.toSQL was replaced with Expression.toQueryBuilder.
Difference is what toQueryBuilder doesn't return String representation of an Expression but only register it in a QueryBuilder.
If you need to get raw SQL value please use Expression.toString.
Features:
- Added where in subquery (#610). Kudos to Manabu OHTAKE for PR.
Bug fixes:
- ClassCastException on an attempt to flush IdTable with reference to Table
- Fixed needQuotes check of already quoted identifiers (#614). Thanks mpe85
- Suspend transactions broken when working with multiple databases (#624)
- Unnecessary select when preloading absent references (#615)
- Updates of entities were executed in random order what could lead to unexpected behavior
Features:
- Added
rightJoin,fullJoinandcrossJoinfunctions. Fedor Korotkov thanks for PR.
Bug fixes:
Connection is closederror when used suspended transactions (#601)- Nested transaction partially commits outer transaction since 0.16.1 (#605)
Bug fixes:
Connection is closederror when used suspended transactions (#601)- EntityHooks fails on commit from suspended transactions
TransactionManager.manageris public again (#599)
Features:
- Spring Boot starter for Exposed (#582). Many kudos to Trey Bastian!
- Nested transactions support (#534). Could be enabled via
Database.useNestedTransactionsproperty. Thanks for initial PR to Antanas Arvasevicius. orWherefunction added (#584)neqinfix function onColumn<EntityID<*>>added (#590)
Bug Fixes:
- Build LIMIT only if size is strictly positive (#586)
optReferencefails with type inference when referenced to non-nullable column (#593)- Impossible to use
referencesonColumn<EntityID<*>>(#591)
Features:
suspendedTransactionfunction introduced to work withinsuspendfunctions. See wiki section for more details.- Custom functions support (#581). See wiki section for more details.
Bug Fixes:
- Duplicated columns in the parameter list of slice() caused unexpected value in ResultRow (#581)
Bug Fixes:
Features:
- Now it's possible to create Entities from aliased tables/queries. Corresponded
wrapRow/wrapRowsfunctions were added toEntityClass(#404) - Support for
regexpfunction (both case-sensitive/insensitive) was provided on every database which provided it concatfunction was introduced (#509)
Performance optimizations:
- Unnecessary string escaping in
registerArgumentswas removed when used prepared statements
Infrastructure:
- Mysql 8.0 tests added
- Oracle tests were reanimated
Deprecations:
InsertStatement.generatedKeyfield removed
Features:
likeoperator forColumn<EntityID<String>>(#117)
Bug Fixes:
- SQLServer dialect fails on loading
extraNameCharactersfrom DatabaseMetadata insertIgnorewith get id on result fails for MySQL (#574)- Oracle dialect improvements
Infrastructure:
- Run MySQL tests on MySQL 5.7+ with jdbc driver
8.0.16(#171) - Oracle tests reanimated on Oracle 18 XE
Bug Fixes:
- Fixed support for H2 1.4.198+ (CVE-2018-10054) (#530, #558)
- LazySizedCollection.limit() produce StackOverflowError exception (#569)
- Explicitly specify constraint name in create table statement (PR #570 from vetrovosk)
Kotlin updated to 1.3.31
Deprecation:
loggerfield removed from Transaction (#447)- Deprecated functions removed: wrapRow, createIndex, groupConcat (with boolean order param), join
- enumeration/enumerationByName with Class<*> param removed
Features:
Bug fixes:
- Only warn of schema/db mismatch if its the case. It isn't on left join. (PR #541 from spand)
- Warn full column name in "Column ... is marked as not null" message
- Escape collate in Text and Varchar columns (PR #554 from doyaaaaaken)
- Aliased tables had use their original names in ON part
Feature:
- Attempt to fetch not only autoincrement values but all returned from insert/batchInsert
- New method (
TransactionManger.closeAndUnregister) to close and unregister a database connection (PR #529 from Max Rumpf)
Bug fixes:
- [MySQL] Constraints fails when table names are in lower case (PR #539 from valepakh)
- [H2, SQLite] SchemaUtils.createMissingTablesAndColumns doesn't correctly check constraints (#535)
Bug fixes:
- Initialize client defaults only for target entity table columns (was broken in #0.13.4 with #526
Infrastructure:
- Finished moving to Gradle Kotlin DSL. Many thanks to Thanks for PR goes to Vladislav Tankov (@tanvd).
Deprecation:
InsertStatement.generatedKeyis forbidden to use now in favour toresultValuesandinsertAndGetId
Features:
- InsertStatement.get function was split into get and getOrNull to simplify get use. Thanks for PR goes to Johannes Jensen (@spand)
Bug fixes:
- clientDefault is called multiple times gives incorrect value (#526)
- Fix composite PK bugs (Thanks Aidar Samerkhanov (@Darych) for PR): incorrect evaluation of last column index in PK and missed column description DDL in ALTER TABLE for non H2 databases.
- forUpdate value was ignored in warmUp* functions when was applied to mapLazy/cached references
- Join on two tables with more than one foreign key constraint fails even with additionalConstraint (#522)
Bug fixes:
- Unable to create index on column that also has a foreign key with
createMissingTablesAndColumns, fix for MySQL (#498) - Use memberProperties instead of declaredMemberProperties in with/preloadRelations.
Bug fixes:
- Wrong values returned from warmUp* functions which leads to N + 1
Features:
Bug fixes:
- Unable to create index on column that also has a foreign key with
createMissingTablesAndColumns(#498) - Using createMissingTablesAndColumns() generates a spurious WARN message in log files (#480)
- Unexpected value of type Int: 26 of org.jetbrains.exposed.dao.EntityID (#501)
- More proper handling of forUpdate/notForUpdate/orderBy on LazySizedCollection
- Problems on comparing binary types (bit from MySQL) (#491)
Kotlin updated to 1.3.21
Features:
- DAO: It's possible to call
orderByonSizedIterableto sort entities (#476) - DSL/DAO: Self join many-to-many relationships (#106). See wiki page for example.
- DSL: Allow to apply groupConcat on expressions (#486). Thanks for PR goes to Edvinas Danevičius (@Edvinas01).
- Log every SQLException thrown inside inTopLevelTransaction with warn instead of info level
- SQLServer dialect will now use
uniqueidentifierfor UUID columns - Compound operations introduced:
compoundAnd/compoundOr(#469) Op.TRUE/Op.FALSEexpressions added- OR operator was optimized to use less braces
- Oracle: Speedup extracting tableColumns metadata
Bug fixes:
- Impossible to set default value with nullable column (#474)
- UUID value not read correctly (#473)
No key generatedexception thrown when trying to insert row to IdTable usinginsertAndGetIdwith explicit id and then make search by returned id (#432)
Deprecations:
- orderBy with boolean sort parameters was deprecated
Features:
- MariaDB support
- Suspending
transactionfunctions (#418) - DAO: It's possible to specify forUpdate state in warmup* functions
Bug fixes:
- Fixed condition when IllegalStateException should be thrown on LazySizedCollection forUpdate/notForUpdate
inTopLevelTransactionacceptsDatabaseinstead ofTransactionManager(#448)- LIMIT is not supported in DELETE SQLite message (#455)
- Limit propagate is same entity (#439)
- forIds/forEntityIds wont return partially cached values
- Accessing enum field in
Entitycreated usingEntityClass.newcausesClassCastException(#464) NoClassDefFoundErrorwhen creating table on Android (#461)exec(String)throwsSQLException: ResultSet already requested(#414)- SQLite autoincrement table is not created correctly (#328)
Deprecations:
- Deprecate InsertStatement.generatedKey (#424)
- Using of
Transactions.loggeris prohibited SchemaUtils.createIndexwith columns and isUnique parameters is prohibitedgroupConcatwith boolean sortOrder is replaced with similarSortOrderversionjoinis replaced withinnerJoin- enumeration/enumerationByName with java
Classreplaced with kotlinKClass
- Kotlin #1.3.0
- Fixed bug that call for createMissingTablesAndColumns could lead to exception while trying to add an index which already exists in db (MySQL only problem)
Features:
- Support entity references by non-ID column (#282)
- groupConcat function reworked and supported on all databases (except SQLite)
- Now it's possible to create cyclic depended tables in single SchemaUtils.createTable() call. Relates to Defer Foreign references during creation (#384)
- Introduced SchemaUtils.checkCycle() function to check tables for cyclic references
- MOD (%) operator support (#391)
- Set RepetitionAttempts in TransactionManager (to set globally) (#393)
- Fail with KNPE on not null columns with null
- Throw exception when trying to change onUpdate state for loaded LazySizedCollection
- Database.dialect field is now public
Bug fixes:
- BatchUpdateStatement results in IllegalStateException: Table.columnName is already initialized (#386)
- BatchUpdateStatement expects set(..) calls in alphabetical order and fails when given more than 2 batches (#388)
- autoIncrement carries to referencing column (#385)
- Query fails when same column/expression provided in slice multiple times
- columnConstraints() returns wrong map with keys in wrong order (target instead of referee)
- Try to expand Query in ExposedSQLException even if it wasn't able to use current transaction.
- Autoinc column does not necessarily need to be the first column in the table (#398)
- "No transaction in context" when using SpringTransactionManager (#365, #407)
- uuid values are not properly escaped in subquery (#415)
- Foreign Key Constraints being recreated (#394)
Features:
- Added
DOUBLEcolumn type (#358). Thanks go to Jonathan Shore (@tr8dr). Entity.refresh()introduced to update its state from database (see kdoc)- All statements classes become open to allowing inheritance (#350)
wherepart made optional inUPDATEstatement (#115)andWherefunction introduced to help in constructing complex queries (#375). See "Conditional where" section on Wiki.
Bug fixes:
- Varchar column doesn't validate length / Validate length only before execute update (#300)
- sqlState doesn't available on
ExposedSQLException(#331) - [SQLite]
ClassCastExceptionwhen reading from VARCHAR column (#369) - Use ::class instead of ::class.java for enumerations (#370)
Previous functions
enumeration/enumerationByNamewere deprecated with quick fix to new ones. Both functions will be removed on next releases. - Multiple join produce "DSL SYNTAX ERROR" (#366)
- Entities flush to a database after a
DROPtable (#112) - Entity id is not generated properly when using
clientDefaulton related column (#313) ClassCastExpectionwhen using alias on a expressions (#379)- [MySQL] Entity ids were not generated properly with
rewriteBatchedStatementsflag is on. - [Oracle]
LONGtype replaced withCLOBfor text columns (#382)
Features:
- ON UPDATE reference constraint added
- All dialects made public and open for extensibility
Transaction.addLogger()function introduced as replacement tologger.addLogger()approach- Strings will be validated against column max length before inserting to database (#300)
- Overriding the fetch size for a Query (#327)
Bug fixes:
- Extended sql exception logging available only in debug mode
- [PostgreSQL] Table with
customEnumerationcolumn doesn't work with Entity/DAO API (#340) - Table with composite key created only with specific prop order (#343)
- allTableNames in VendorDialect returns only from current database (#339)
- "ORA-00972: identifier is too long" on creating table with long name
Features:
- Floating point columns
- Check constraint functionallity (kudos to @SackCastellon)
- Possibility to provide custom names for contraints and indexes (thanks to @mduesterhoeft)
- Added support to delete with limit and offset (thanks @Mon_chi for initial PR)
- Full SQL will be now logged on any SQLException (#288 [Suggestion] Log the SQL query when an exception is thrown)
- Postgres support for ignore + replace
- H2 support for INSERT IGNORE for new H2 version
- Statement interceptors now allow triggering on before commit and rollback
- Database ENUM types supported (read more here)
Bug fixes: