Andrey
Andrey

Reputation: 23

sort the table by column name Exposed Kotlin

Good afternoon, I want to make a universal sort for all tables. The idea is that the method will receive the name of the column as input and, through reflection, I will receive a link to the field of the same name.

 val id = "id"
        var a = JobSeekerTable::class
        a.memberProperties.forEach { e ->
            if (e.name == id) {
                transaction {
                    JobSeeker.all().sortedBy { e.getter }
                }

            }
        }

Unfortunately, this does not work. There was an option, through the fields field that the table has

JobSeekerTable.fields.forEach {v->
            transaction {
                JobSeeker.all().sortedBy { v }
            }
        }

but also unsuccessfully :( If there is any way to refer to the required field through the name. Not using if and stuff like that?

Upvotes: 2

Views: 913

Answers (1)

Alexey Soshin
Alexey Soshin

Reputation: 17721

First, you are probably looking for orderBy, not sortedBy. The former is to order SQL query results, the later is to sort a collection.

Second, you want to pass an instance of a column:

val id = "id"
JobSeekerTable.selectAll().orderBy(JobSeekerTable.columns.find {
    it.name == id // Here I used the name you provided, although probably it should be named something like columnName
} !!  to SortOrder.ASC)

Using "screaming" operator (!!) in Kotlin is a bad practice. So if all of your tables have ID column, for example, you can use "elvis" operator instead.

JobSeekerTable.selectAll().orderBy((JobSeekerTable.columns.find {
    it.name == id
} ?: JobSeekerTable.id) to SortOrder.ASC)

Upvotes: 2

Related Questions