-
Notifications
You must be signed in to change notification settings - Fork 690
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
address comments and reorganize code examples
- Loading branch information
Showing
15 changed files
with
395 additions
and
253 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
146 changes: 21 additions & 125 deletions
146
documentation-website/Writerside/snippets/exposed-dao/src/main/kotlin/org/example/App.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,138 +1,34 @@ | ||
package org.example | ||
|
||
import org.example.entities.* | ||
import org.example.tables.* | ||
import org.jetbrains.exposed.dao.id.CompositeID | ||
import org.jetbrains.exposed.sql.* | ||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq | ||
import org.example.examples.* | ||
import org.example.tables.CitiesTable | ||
import org.example.tables.DirectorsTable | ||
import org.example.tables.StarWarsFilmsTable | ||
import org.example.tables.UserRatingsTable | ||
import org.example.tables.UsersTable | ||
import org.jetbrains.exposed.sql.Database | ||
import org.jetbrains.exposed.sql.SchemaUtils | ||
import org.jetbrains.exposed.sql.StdOutSqlLogger | ||
import org.jetbrains.exposed.sql.addLogger | ||
import org.jetbrains.exposed.sql.transactions.transaction | ||
import java.util.* | ||
|
||
fun main() { | ||
Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") | ||
|
||
transaction { | ||
addLogger(StdOutSqlLogger) | ||
createFilms() | ||
createDirectors() | ||
createUsersAndRatings() | ||
} | ||
} | ||
|
||
fun createFilms() { | ||
SchemaUtils.create(StarWarsFilmsTable) | ||
|
||
// Create a new record | ||
val movie = StarWarsFilmEntity.new { | ||
name = "The Last Jedi" | ||
sequelId = 8 | ||
director = "Rian Johnson" | ||
} | ||
|
||
// Create a new record with id | ||
StarWarsFilmEntity.new(id = 2) { | ||
name = "The Rise of Skywalker" | ||
sequelId = 9 | ||
director = "J.J. Abrams" | ||
} | ||
|
||
// Read a property value | ||
val movieName = movie.name | ||
println("Created a new film named $movieName") | ||
|
||
// Read the id value | ||
val movieId: Int = movie.id.value | ||
println("The id of the new movie is $movieId") | ||
|
||
// Read all movies | ||
val allMovies = StarWarsFilmEntity.all() | ||
allMovies.forEach({ println(it.name) }) | ||
|
||
// Sort results in ascending order | ||
val moviesByAscOrder = StarWarsFilmEntity.all().sortedBy { it.sequelId } | ||
moviesByAscOrder.map { println(it.sequelId) } | ||
|
||
// Sort results in descending order | ||
val moviesByDescOrder = StarWarsFilmEntity.all().sortedByDescending { it.sequelId } | ||
moviesByDescOrder.map { println(it.sequelId) } | ||
|
||
// Read all with a condition | ||
val specificMovie = StarWarsFilmEntity.find { StarWarsFilmsTable.sequelId eq 8 } | ||
specificMovie.forEach({ println("Found a movie with sequelId 8 and name " + it.name) }) | ||
|
||
// Get an entity by its id value | ||
val fifthMovie = StarWarsFilmEntity.findById(5) | ||
println(fifthMovie?.name) | ||
|
||
// Update an entity value | ||
movie.name = "Episode VIII – The Last Jedi" | ||
|
||
// Find by id and update | ||
val updatedMovie = StarWarsFilmEntity.findByIdAndUpdate(5) { | ||
it.name = "Episode VIII – The Last Jedi" | ||
} | ||
println(updatedMovie?.name) | ||
|
||
// Find a single record by a condition and update | ||
val updatedMovie2 = StarWarsFilmEntity.findSingleByAndUpdate(StarWarsFilmsTable.name eq "The Last Jedi") { | ||
it.name = "Episode VIII – The Last Jedi" | ||
} | ||
println(updatedMovie2?.name) | ||
|
||
// Delete a record | ||
movie.delete() | ||
} | ||
|
||
fun createDirectors() { | ||
SchemaUtils.create(DirectorsTable) | ||
|
||
val directorId = CompositeID { | ||
it[DirectorsTable.name] = "J.J. Abrams" | ||
it[DirectorsTable.guildId] = UUID.randomUUID() | ||
} | ||
SchemaUtils.create(StarWarsFilmsTable) | ||
SchemaUtils.create(DirectorsTable) | ||
SchemaUtils.create(UsersTable) | ||
SchemaUtils.create(UserRatingsTable) | ||
SchemaUtils.create(CitiesTable) | ||
|
||
DirectorEntity.new(directorId) { | ||
genre = Genre.SCI_FI | ||
} | ||
|
||
// Find records by composite id | ||
/* | ||
SELECT DIRECTORS."name", DIRECTORS.GUILD_ID, DIRECTORS.GENRE | ||
FROM DIRECTORS | ||
WHERE (DIRECTORS."name" = 'J.J. Abrams') | ||
AND (DIRECTORS.GUILD_ID = '2cc64f4f-1a2c-41ce-bda1-ee492f787f4b') | ||
*/ | ||
val directors = DirectorEntity.find { DirectorsTable.id eq directorId } | ||
directors.forEach({ println(it.genre) }) | ||
} | ||
|
||
fun createUsersAndRatings() { | ||
SchemaUtils.create(UsersTable) | ||
SchemaUtils.create(UserRatingsTable) | ||
SchemaUtils.create(CitiesTable) | ||
// Create examples | ||
val createExamples = CreateExamples() | ||
createExamples.createFilms() | ||
|
||
// Read an entity with a join to another table | ||
val query = UsersTable.innerJoin(UserRatingsTable).innerJoin(StarWarsFilmsTable) | ||
.select(UsersTable.columns) | ||
.where { | ||
StarWarsFilmsTable.sequelId eq 2 and (UserRatingsTable.value greater 5) | ||
}.withDistinct() | ||
|
||
val users = UserEntity.wrapRows(query).toList() | ||
users.map { println(it.name) } | ||
|
||
CitiesTable.insert { | ||
it[name] = "Amsterdam" | ||
// Read examples | ||
val readExamples = ReadExamples() | ||
readExamples.readExamples() | ||
} | ||
|
||
// Use a query as an expression to sort cities by the number of users in each city | ||
val expression = wrapAsExpression<Int>( | ||
UsersTable.select(UsersTable.id.count()) | ||
.where { CitiesTable.id eq UsersTable.cityId } | ||
) | ||
val cities = CitiesTable.selectAll() | ||
.orderBy(expression, SortOrder.DESC) | ||
.toList() | ||
|
||
cities.map { println(it[CitiesTable.name]) } | ||
} |
25 changes: 25 additions & 0 deletions
25
...iterside/snippets/exposed-dao/src/main/kotlin/org/example/entities/ComputedFieldEntity.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
package org.example.entities | ||
|
||
import org.example.tables.StarWarsWFilmsWithRankTable | ||
import org.jetbrains.exposed.dao.IntEntity | ||
import org.jetbrains.exposed.dao.IntEntityClass | ||
import org.jetbrains.exposed.dao.id.EntityID | ||
import org.jetbrains.exposed.sql.Op | ||
import org.jetbrains.exposed.sql.Query | ||
|
||
class StarWarsWFilmWithRankEntity(id: EntityID<Int>) : IntEntity(id) { | ||
var sequelId by StarWarsWFilmsWithRankTable.sequelId | ||
var name by StarWarsWFilmsWithRankTable.name | ||
var rating by StarWarsWFilmsWithRankTable.rating | ||
|
||
val rank: Long | ||
get() = readValues[StarWarsWFilmsWithRankTable.rank] | ||
|
||
companion object : IntEntityClass<StarWarsWFilmWithRankEntity>(StarWarsWFilmsWithRankTable) { | ||
override fun searchQuery(op: Op<Boolean>): Query { | ||
return super.searchQuery(op).adjustSelect { | ||
select(columns + StarWarsWFilmsWithRankTable.rank) | ||
} | ||
} | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
...rside/snippets/exposed-dao/src/main/kotlin/org/example/entities/CustomColumnTypeEntity.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package org.example.entities | ||
|
||
import org.example.tables.DirectorsCustomTable | ||
import org.jetbrains.exposed.dao.Entity | ||
import org.jetbrains.exposed.dao.EntityClass | ||
import org.jetbrains.exposed.dao.id.EntityID | ||
|
||
class DirectorCustomEntity(id: EntityID<String>) : Entity<String>(id) { | ||
companion object : EntityClass<String, DirectorCustomEntity>(DirectorsCustomTable) | ||
|
||
var name by DirectorsCustomTable.name | ||
} |
37 changes: 37 additions & 0 deletions
37
...te/Writerside/snippets/exposed-dao/src/main/kotlin/org/example/examples/CreateExamples.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
package org.example.examples | ||
|
||
import org.example.entities.DirectorEntity | ||
import org.example.entities.StarWarsFilmEntity | ||
import org.example.tables.DirectorsTable | ||
import org.example.tables.Genre | ||
import org.jetbrains.exposed.dao.id.CompositeID | ||
import java.util.* | ||
|
||
class CreateExamples { | ||
fun createFilms() { | ||
val movie = StarWarsFilmEntity.new { | ||
name = "The Last Jedi" | ||
sequelId = 8 | ||
director = "Rian Johnson" | ||
} | ||
|
||
// Create a new record with id | ||
val movie2 = StarWarsFilmEntity.new(id = 2) { | ||
name = "The Rise of Skywalker" | ||
sequelId = 9 | ||
director = "J.J. Abrams" | ||
} | ||
} | ||
|
||
fun createNewWithCompositeId() { | ||
val directorId = CompositeID { | ||
it[DirectorsTable.name] = "J.J. Abrams" | ||
it[DirectorsTable.guildId] = UUID.randomUUID() | ||
} | ||
|
||
val director = DirectorEntity.new(directorId) { | ||
genre = Genre.SCI_FI | ||
} | ||
} | ||
|
||
} |
14 changes: 14 additions & 0 deletions
14
...te/Writerside/snippets/exposed-dao/src/main/kotlin/org/example/examples/DeleteExamples.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package org.example.examples | ||
|
||
import org.example.entities.StarWarsFilmEntity | ||
|
||
class DeleteExamples { | ||
fun deleteFilm() { | ||
val movie = StarWarsFilmEntity.new { | ||
name = "The Last Jedi" | ||
sequelId = 8 | ||
director = "Rian Johnson" | ||
} | ||
val deletedMovie = movie.delete() | ||
} | ||
} |
105 changes: 105 additions & 0 deletions
105
...site/Writerside/snippets/exposed-dao/src/main/kotlin/org/example/examples/ReadExamples.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package org.example.examples | ||
|
||
import org.example.entities.DirectorEntity | ||
import org.example.entities.StarWarsFilmEntity | ||
import org.example.entities.StarWarsWFilmWithRankEntity | ||
import org.example.entities.UserEntity | ||
import org.example.tables.CitiesTable | ||
import org.example.tables.DirectorsTable | ||
import org.example.tables.StarWarsFilmsTable | ||
import org.example.tables.UserRatingsTable | ||
import org.example.tables.UsersTable | ||
import org.jetbrains.exposed.dao.id.CompositeID | ||
import org.jetbrains.exposed.sql.SortOrder | ||
import org.jetbrains.exposed.sql.and | ||
import org.jetbrains.exposed.sql.count | ||
import org.jetbrains.exposed.sql.insert | ||
import org.jetbrains.exposed.sql.selectAll | ||
import org.jetbrains.exposed.sql.wrapAsExpression | ||
import java.util.* | ||
|
||
class ReadExamples { | ||
fun readAll() { | ||
// Read all movies | ||
val allMovies = StarWarsFilmEntity.all() | ||
allMovies.forEach({ println(it.name) }) | ||
|
||
// Sort results in ascending order | ||
val moviesByAscOrder = StarWarsFilmEntity.all().sortedBy { it.sequelId } | ||
moviesByAscOrder.map { println(it.sequelId) } | ||
|
||
// Sort results in descending order | ||
val moviesByDescOrder = StarWarsFilmEntity.all().sortedByDescending { it.sequelId } | ||
moviesByDescOrder.map { println(it.sequelId) } | ||
} | ||
|
||
fun find() { | ||
// Get an entity by its id value | ||
val movie = StarWarsFilmEntity.findById(2) | ||
|
||
if(movie != null) { | ||
// Read a property value | ||
val movieName = movie.name | ||
println("Created a new film named $movieName") | ||
|
||
// Read the id value | ||
val movieId: Int = movie.id.value | ||
println("The id of the new movie is $movieId") | ||
} | ||
|
||
// Read all with a condition | ||
val specificMovie = StarWarsFilmEntity.find { StarWarsFilmsTable.sequelId eq 8 } | ||
specificMovie.forEach({ println("Found a movie with sequelId 8 and name " + it.name) }) | ||
} | ||
|
||
// Read an entity with a join to another table | ||
fun readWithJoin() { | ||
val query = UsersTable.innerJoin(UserRatingsTable).innerJoin(StarWarsFilmsTable) | ||
.select(UsersTable.columns) | ||
.where { | ||
StarWarsFilmsTable.sequelId eq 2 and (UserRatingsTable.value greater 5) | ||
}.withDistinct() | ||
|
||
val users = UserEntity.wrapRows(query).toList() | ||
users.map { println(it.name) } | ||
} | ||
|
||
fun findByCompositeId() { | ||
// Find records by composite id | ||
val directorId = CompositeID { | ||
it[DirectorsTable.name] = "J.J. Abrams" | ||
it[DirectorsTable.guildId] = UUID.randomUUID() | ||
} | ||
|
||
val directors = DirectorEntity.find { DirectorsTable.id eq directorId } | ||
directors.forEach({ println(it.genre) }) | ||
} | ||
|
||
fun queriesAsExpressions() { | ||
// Use a query as an expression to sort cities by the number of users in each city | ||
CitiesTable.insert { | ||
it[name] = "Amsterdam" | ||
} | ||
|
||
val expression = wrapAsExpression<Int>( | ||
UsersTable.select(UsersTable.id.count()) | ||
.where { CitiesTable.id eq UsersTable.cityId } | ||
) | ||
val cities = CitiesTable.selectAll() | ||
.orderBy(expression, SortOrder.DESC) | ||
.toList() | ||
|
||
cities.map { println(it[CitiesTable.name]) } | ||
} | ||
|
||
fun readComputedField() { | ||
StarWarsWFilmWithRankEntity.new { | ||
sequelId = 8 | ||
name = "The Last Jedi" | ||
rating = 4.2 | ||
} | ||
|
||
StarWarsWFilmWithRankEntity.find { StarWarsFilmsTable.name like "The%" }.map { it.name to it.rank } | ||
} | ||
|
||
} |
22 changes: 22 additions & 0 deletions
22
...te/Writerside/snippets/exposed-dao/src/main/kotlin/org/example/examples/UpdateExamples.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package org.example.examples | ||
|
||
import org.example.entities.StarWarsFilmEntity | ||
import org.example.tables.StarWarsFilmsTable | ||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq | ||
|
||
class UpdateExamples { | ||
fun updateFilms() { | ||
// Find by id and update | ||
val updatedMovie = StarWarsFilmEntity.findByIdAndUpdate(5) { | ||
it.name = "Episode VIII – The Last Jedi" | ||
} | ||
println(updatedMovie?.name) | ||
|
||
// Find a single record by a condition and update | ||
val updatedMovie2 = StarWarsFilmEntity.findSingleByAndUpdate(StarWarsFilmsTable.name eq "The Last Jedi") { | ||
it.name = "Episode VIII – The Last Jedi" | ||
} | ||
println(updatedMovie2?.name) | ||
} | ||
|
||
} |
Oops, something went wrong.