Вы можете объединить две таблицы и получить объект obj (из первой таблицы), содержащий список obj (из второй таблицы) - PullRequest
0 голосов
/ 05 марта 2020

Прежде всего мой код:
Таблица 1:

object Company : Table() {
    val name = varchar("pk_name", 250)
    override val primaryKey = PrimaryKey(name, name = "pk_company_constraint")
}

Таблица 2 и 3:

object Sector : IntIdTable() {
    val name = varchar("fk_name", 50).references(MainSector.name)
    val alias = varchar("alias", 50).nullable()
    val companyName = varchar("fk_company_name", 250).references(Company.name, onDelete = ReferenceOption.CASCADE)
}

object MainSector : Table() {
    val name = varchar("pk_name", 50)
    override val primaryKey = PrimaryKey(name, name = "pk_main_sector_constraint")
}

Моя проблема:
Мне нужно проанализировать результат в DTO, которое выглядит так:

data class CompanyDTO (
        val companyName: String,
        val sectorList: List<SectorDTO>
)
data class SectorDTO (
        val mainSectorName: String,
        val sectorAlias: String
)

Я могу получить Компанию с первым Сектором из базы данных, но я не знаю, как получить их список.
Моя попытка:

override fun retrieveCompanies(vararg names: String): List<CompanyDTO> {
        var retlist: List<CompanyDTO> = emptyList()
        if (names.isEmpty()){
            retlist = transaction {
                (Company innerJoin Sector)
                .select{Company.name eq Sector.companyName}
                .map { CompanyDTO(it[Company.name], listOf(
                        SectorDTO(it[Sector.name], it[Sector.alias]?: "")
                )) }
            }
        } else {
//return specific
        }
        return retlist
    }

Если аргументы не указаны, я хочу вернуть все компании из базы данных, если аргументы даны, я хочу вернуть только компании с указанным именем. Я ничего не могу найти об этой топике c в официальной документации, пожалуйста, пришлите помощь

1 Ответ

0 голосов
/ 06 марта 2020

Если Company не может иметь Sector, вам нужно использовать leftJoin, и тогда ваш код может выглядеть следующим образом:

Company.leftJoin.Sector.selectAll().map {
    val companyName = it[Company.name] 
    val sector = it.tryGet(Sector.name)?.let { name ->
        SectorDTO(name, it[Sector.alias].orEmpty())
    }
    companyName to sector
}.groupBy({ it.first }, { it.second }).map { (companyName, sectors) ->
    CompanyDTO(companyName, sectors.filterNotNull())
}
...