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
,UUIDTable
classes fromexposed-core
were moved fromorg.jetbrains.exposed.dao
toorg.jetbrains.exposed.dao.id
package along withexposed-jodatime
module classes to support Java 9 module system. To help with migration, old classes were deprecated with properreplaceWith
option. Read migration guide for more details.
Features:
selectBatched
andselectAllBatched
functions 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
newSuspendedTransactionAsync
now returnsDeferred
instead ofTransactionResult
(which was removed completely)TransactionResult.andThen
function 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
month
built-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
load
andwith
functions was supported
Critical bug fix:
- Transaction isolation level wasn't applied to transaction
Critical bug fix:
and
function executed onAnd
expression mutates expression state
Features:
SchemaUtils
functions (create/createMissingTablesAndColumns/drop
) could be executed withinBatch
flag 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
short
column type support backed withSMALLINT
SQL type - Added
greater/greaterEq/less/lessEq
functions 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
,fullJoin
andcrossJoin
functions. Fedor Korotkov thanks for PR.
Bug fixes:
Connection is closed
error when used suspended transactions (#601)- Nested transaction partially commits outer transaction since 0.16.1 (#605)
Bug fixes:
Connection is closed
error when used suspended transactions (#601)- EntityHooks fails on commit from suspended transactions
TransactionManager.manager
is public again (#599)
Features:
- Spring Boot starter for Exposed (#582). Many kudos to Trey Bastian!
- Nested transactions support (#534). Could be enabled via
Database.useNestedTransactions
property. Thanks for initial PR to Antanas Arvasevicius. orWhere
function added (#584)neq
infix function onColumn<EntityID<*>>
added (#590)
Bug Fixes:
- Build LIMIT only if size is strictly positive (#586)
optReference
fails with type inference when referenced to non-nullable column (#593)- Impossible to use
references
onColumn<EntityID<*>>
(#591)
Features:
suspendedTransaction
function introduced to work withinsuspend
functions. 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/wrapRows
functions were added toEntityClass
(#404) - Support for
regexp
function (both case-sensitive/insensitive) was provided on every database which provided it concat
function was introduced (#509)
Performance optimizations:
- Unnecessary string escaping in
registerArguments
was removed when used prepared statements
Infrastructure:
- Mysql 8.0 tests added
- Oracle tests were reanimated
Deprecations:
InsertStatement.generatedKey
field removed
Features:
like
operator forColumn<EntityID<String>>
(#117)
Bug Fixes:
- SQLServer dialect fails on loading
extraNameCharacters
from DatabaseMetadata insertIgnore
with 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:
logger
field 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.generatedKey
is forbidden to use now in favour toresultValues
andinsertAndGetId
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
orderBy
onSizedIterable
to 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
uniqueidentifier
for UUID columns - Compound operations introduced:
compoundAnd
/compoundOr
(#469) Op.TRUE
/Op.FALSE
expressions 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 generated
exception thrown when trying to insert row to IdTable usinginsertAndGetId
with explicit id and then make search by returned id (#432)
Deprecations:
- orderBy with boolean sort parameters was deprecated
Features:
- MariaDB support
- Suspending
transaction
functions (#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
inTopLevelTransaction
acceptsDatabase
instead 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
Entity
created usingEntityClass.new
causesClassCastException
(#464) NoClassDefFoundError
when 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.logger
is prohibited SchemaUtils.createIndex
with columns and isUnique parameters is prohibitedgroupConcat
with boolean sortOrder is replaced with similarSortOrder
versionjoin
is replaced withinnerJoin
- enumeration/enumerationByName with java
Class
replaced 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
DOUBLE
column 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)
where
part made optional inUPDATE
statement (#115)andWhere
function 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]
ClassCastException
when reading from VARCHAR column (#369) - Use ::class instead of ::class.java for enumerations (#370)
Previous functions
enumeration
/enumerationByName
were 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
DROP
table (#112) - Entity id is not generated properly when using
clientDefault
on related column (#313) ClassCastExpection
when using alias on a expressions (#379)- [MySQL] Entity ids were not generated properly with
rewriteBatchedStatements
flag is on. - [Oracle]
LONG
type replaced withCLOB
for 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
customEnumeration
column 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: