Search code examples
kotlinkotlin-exposed

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?


Solution

  • 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)