java - 链接生成的 Jooq 类时如何解决不明确的匹配
问题描述
我已经在 JPA 中定义了我的模型,并正在为我的应用程序编写一些查询,并且我正在使用 JOOQ 生成的类将所有表连接在一起,以检查请求的资源是否实际上属于请求用户。
但是,当我这样做时,会收到以下警告:
Ambiguous match found for ID. Both "alias_4548634"."ID" and "alias_47496750"."ID" match.
java.sql.SQLWarning: null
at org.jooq.impl.Fields.field(Fields.java:132) ~[jooq-3.11.10.jar:?]
... etc
这是我的代码
db.select(countField)
.from(thing)
.where(JThing.THING.thingBucket().bucket().organization().customer().ID.in(idList))
.orderBy(countField)
这是它生成的 SQL
SELECT
count(PUBLIC.THING.ID) AS count
FROM (
PUBLIC.THING
LEFT OUTER JOIN (
PUBLIC.THING_BUCKET AS alias_72652126
LEFT OUTER JOIN (
PUBLIC.BUCKET AS alias_4548634
LEFT OUTER JOIN (
PUBLIC.ORGANISATION AS alias_43016761
LEFT OUTER JOIN PUBLIC.CUSTOMER AS alias_47496750
ON alias_43016761.CUSTOMER_ID = alias_47496750.ID
)
ON alias_4548634.ORGANISATION_ID = alias_43016761.ID
)
ON alias_72652126.ID = alias_4548634.ID
)
ON PUBLIC.THING.THING_BUCKET_ID = alias_72652126.ID
)
WHERE alias_47496750.ID IN (81353)
ORDER BY count
鉴于 JOOQ 正在生成 SQL,我希望它能够理解它而不会引发错误。我错过了什么?我该如何配置/查询/什么来解决 SQLWarning?
更新
在玩了之后,我已经确定了问题的根源。
THING_BUCKET 是 BUCKET 的子类型,因此 THING_BUCKET.ID = BUCKET.ID
如果我将查询重写为我得到相同的结果,但没有错误
SELECT
count(PUBLIC.THING.ID) AS count
FROM (
PUBLIC.THING
LEFT OUTER JOIN (
PUBLIC.BUCKET AS alias_4548634
LEFT OUTER JOIN (
PUBLIC.ORGANISATION AS alias_43016761
LEFT OUTER JOIN PUBLIC.CUSTOMER AS alias_47496750
ON alias_43016761.CUSTOMER_ID = alias_47496750.ID
)
ON alias_4548634.ORGANISATION_ID = alias_43016761.ID
)
ON PUBLIC.THING.BUCKET_ID = alias_4548634.ID
)
WHERE alias_47496750.ID IN (81353)
ORDER BY count
所以我想做的就是去
db.select(countField)
.from(thing)
.where(JThing.THING.bucket().organization().customer().ID.in(idList))
.orderBy(countField)
并将我的 THING 直接加入 BUCKET 而不是 THING_BUCKET,但我不知道如何使用生成的类来完成此操作。
解决方案
根据您的描述,看起来像 BUCKET 和 THINK_BUCKET 被描述为 db 级别的子类型,被 jooq 生成的类弄糊涂了。
短期修复可能是,在 db 级别切断层次关系,重新生成并查看会发生什么。
推荐阅读
- c - macOS 中的 mmap 和文件删除
- javascript - 快速验证器 - 自定义密码验证器无法读取未定义的属性
- android - @string/appbar_scrolling_view_behavior 在 com.android.support:design 中被标记为私有
- c# - 最大化自己的窗口不会覆盖整个屏幕
- r - 在 tibble 中将数据从右列移动到左列
- angular - 在 ng-bootstrap angular5 中激活和停用模式弹出窗口
- node.js - 将图像上传到 Azure Blob 存储
- ubuntu - ubuntu apt-get 未满足的 libsmbios2v5 和 libsmbios2 依赖项
- json - 如何使用 jq 提取此 JSON 片段中 href 的值?
- ruby-on-rails - Rails 活动模型序列化程序如何处理嵌套资源?