sql - JOOQ-选择不同的加入-提取映射器

标签 sql kotlin jooq

这是我尝试使用JOOQ创建的SQL-

select distinct(kmp.*) from office_all_company_kmp kmp
 inner join company_kmp companykmp on kmp.id=companykmp.kmp_id
 where companykmp.company_id=?1

我正在用Kotlin编写代码。我这样做有2个问题-
  • 在select子句中,除非我将.asList()添加到fields数组,否则无法对其进行编译。
  • 必须手动编写获取映射器。有没有一种方法可以在不编写所有代码的情况下使用它?我可以映射从一个表取回的记录,而无需编写任何映射。

  • 这是我在说的:

    fun OfficeAllCompanyKmpDao.findByCompany(companyId: UUID): List<OfficeAllCompanyKmp> =
        this.ctx()
            .selectDistinct(OFFICE_ALL_COMPANY_KMP.fields().asList()) // without the asList() it wouldn't compile
            .from(OFFICE_ALL_COMPANY_KMP)
            .join(COMPANY_KMP).on(OFFICE_ALL_COMPANY_KMP.ID.eq(COMPANY_KMP.KMP_ID))
            .where(COMPANY_KMP.COMPANY_ID.eq(companyId))
            .fetch { // how do I write the mapper without manually writing code like the below?
                OfficeAllCompanyKmp(
                    id = it[OFFICE_ALL_COMPANY_KMP.ID],
                    officeId = it[OFFICE_ALL_COMPANY_KMP.OFFICE_ID],
                    din = it[OFFICE_ALL_COMPANY_KMP.DIN],
                    pan = it[OFFICE_ALL_COMPANY_KMP.PAN],
                    name = it[OFFICE_ALL_COMPANY_KMP.NAME],
                    dateOfBirth = it[OFFICE_ALL_COMPANY_KMP.DATE_OF_BIRTH],
                    address = it[OFFICE_ALL_COMPANY_KMP.ADDRESS],
                    email = it[OFFICE_ALL_COMPANY_KMP.EMAIL],
                    kmpDetails = it[OFFICE_ALL_COMPANY_KMP.KMP_DETAILS],
                    createdTimestamp = it[OFFICE_ALL_COMPANY_KMP.CREATED_TIMESTAMP],
                    updatedTimestamp = it[OFFICE_ALL_COMPANY_KMP.UPDATED_TIMESTAMP],
                    versionNo = it[OFFICE_ALL_COMPANY_KMP.VERSION_NO],
                    createdUserId = it[OFFICE_ALL_COMPANY_KMP.CREATED_USER_ID],
                    updatedUserId = it[OFFICE_ALL_COMPANY_KMP.UPDATED_USER_ID]
                )
            }
    

    最佳答案

    比内部联接再删除重复项更好的方法是使用INEXISTS半联接另一个表:

    this.ctx()
        .selectFrom(OFFICE_ALL_COMPANY_KMP)
        .where(OFFICE_ALL_COMPANY_KMP.ID.`in`(
             select(COMPANY_KMP.KMP_ID)
            .from(COMPANY_KMP)
            .where(COMPANY_KMP.COMPANY_ID.eq(companyId)))
        .fetchInto(OfficeAllCompanyKmp::class.java)
    

    或者,也可以使用jOOQ的合成 LEFT SEMI JOIN syntax(see also this blog post for an explanation for this syntaxthis one for joins in generalWikipedia's nice explanation about semi joins)

    this.ctx()
        .select()
        .from(OFFICE_ALL_COMPANY_KMP)
        .leftSemiJoin(COMPANY_KMP)
        .on(OFFICE_ALL_COMPANY_KMP.ID.eq(COMPANY_KMP.KMP_ID))
        .and(COMPANY_KMP.COMPANY_ID.eq(companyId))
        .fetchInto(OfficeAllCompanyKmp::class.java)
    

    您的问题1)通过使用其他jOOQ API消失了,您不必在SELECT中显式列出所有列。您的问题2)可以通过调用fetchInto()轻松解决。

    关于sql - JOOQ-选择不同的加入-提取映射器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61567352/

    相关文章:

    java - 模棱两可的方法调用未通过转换解决

    java - 单元测试中的 Spring 事务和基于注释的配置

    sql - 在Oracle SQL中,我可以查询表的一个分区而不是整个表以使其运行得更快吗?

    sql - 在 SQL 中使用 SELECT INTO 创建新表

    java - 在jooq中添加DATE和FROM_UNIXTIME字段的分组

    java - Jackson 与 Kotlin : how to serialize only annotated properties

    Android Sleep API - 未获取数据

    sql - 使用 Oracle SQL 查询为组中的每个元素添加序列号

    mysql - 创建一个新的连接表以反射(reflect)连接表之一中的两列主键

    android - 如何解决 Facebook 登录时出现 "Login Error: There is an error in logging you into this application. Please try again later."错误