这是我尝试使用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个问题-
这是我在说的:
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]
)
}
最佳答案
比内部联接再删除重复项更好的方法是使用IN
或EXISTS
半联接另一个表:
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 syntax或this one for joins in general或Wikipedia'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/