Exposed 0.55.0 Help

Frequently Asked Questions

Q: Squash is same as Exposed. Where is the difference?

A: Ilya Ryzhenkov (Squash maintainer) answers:

Q: Can I use multiple Database Connections?

A: Yes. See Transactions

Q: Is Array column type supported?

A: Yes. See Data Types.

Q: Is upsert supported?

A: Yes. See Insert Or Update

Q: Is json type supported?

A: Yes. See JSON

Q: How to get a plain SQL query which will be executed?

A:

val plainSQL = FooTable.selectAll().where {}.prepareSQL(QueryBuilder(false))

Use QueryBuiler with false - if you want to inline statement arguments, true - to see '?' in query.

Q: Is it possible to use native sql / sql as a string?

A: It is not supported as part of the library, but it is possible to implement on top of it and use it like this:

fun <T:Any> String.execAndMap(transform : (ResultSet) -> T) : List<T> { val result = arrayListOf<T>() TransactionManager.current().exec(this) { rs -> while (rs.next()) { result += transform(rs) } } return result } "select u.name, c.name from user u inner join city c where blah blah".execAndMap { rs -> rs.getString("u.name") to rs.getString("c.name") }

More info in this issue: https://github.com/JetBrains/Exposed/issues/118

Q: Is it possible to update a field relative to current field value?

A: Yes. See example here: https://github.com/JetBrains/Exposed/wiki/DSL#update

Q: How can I add another type of Database?

A: Implement DatabaseDialect interface and register it with Database.registerDialect().
If the implementation adds a lot of value consider contributing it as a PR to Exposed.

Q: Is it possible to create tables with cross / cyclic reference?

A: Yes, it's possible since Exposed 0.11.1 version

Q: How can I implement nested queries?

A: See example here: https://github.com/JetBrains/Exposed/issues/248

Q: How can I use SAVEPOINT?

A: It possible only through using a raw connection. See example here.

Q: How to prepare query like: SELECT * FROM table WHERE (x,y) IN ((1, 2), (3, 4), (5, 6))

A: It possible with custom function. See example.

Q: Where can I find snapshot builds of Exposed

A: You could use jitpack.io service for that.

Add jitpack.io to repositories:

repositories { maven { url 'https://jitpack.io' } }

Then add Exposed dependency as stated below:

dependencies { implementation 'com.github.JetBrains:Exposed:-SNAPSHOT' }

Q: How can I create a custom column type?

A: Just implements IColumnType and use registerColumn to extends a Table

eg: Create custom UUID types (inpired by @pjagielski article)

abstract class TypedId(open val id: UUID): Serializable, Comparable<TypedId> { override fun compareTo(other: TypedId) = this.id.compareTo(other.id) } class TypedUUIDColumnType<T: TypedId>(val constructor: (UUID) -> T, private val uuidColType: UUIDColumnType = UUIDColumnType()): IColumnType by uuidColType { override fun valueFromDB(value: Any) = constructor(uuidColType.valueFromDB(value)) override fun notNullValueToDB(value: Any): Any = uuidColType.notNullValueToDB(valueUnwrap(value)) override fun nonNullValueToString(value: Any): String = uuidColType.nonNullValueToString(valueUnwrap(value)) private fun valueUnwrap(value: Any) = (value as? TypedId)?.id ?: value } fun <T: TypedId> Table.typedUuid(name: String, constructor: (UUID) -> T) = registerColumn<T>(name, TypedUUIDColumnType<T>(constructor)) fun <T: TypedId> Column<T>.autoGenerate(constructor: (UUID) -> T): Column<T> = clientDefault { constructor(UUID.randomUUID()) } class StarWarsFilmId(id: UUID): TypedId(id) object StarWarsFilms : Table() { val id = typedUuid("id") { StarWarsFilmId(it) }.autoGenerate{ StarWarsFilmId(it) } val name: Column<String> = varchar("name", 50) val director: Column<String> = varchar("director", 50) final override val primaryKey = PrimaryKey(id) }

Reference: #149

More questions on Stack Overflow:

https://stackoverflow.com/questions/tagged/kotlin-exposed

Last modified: 25 September 2024