如何解决使用JOOQ在多对多关系表中插入值 您不会在插入 a b c d e f alpha beta gamma 0 -0.725042 -0.756909 0.070109 0.850219 1.792450 1.324259 -1.450084 -3.784547 0.420656 1 -0.062379 -0.105332 -1.222571 -1
我的数据库中有三个表SUBSCRIPTION
,USER_ID
和一个名为SUBSCRIPTION_USER_ID
的关联表。
我的策略是对三个查询使用JOOQ
批处理,第一个查询将行插入SUBSCRIPTION
中,第二个查询将多行插入USER_ID
中,最后,我需要将关联ID插入SUBSCRIPTION_USER_ID
中,因此我执行了以下操作:
InsertValuesStep2 insertUserIds = insertInto(
USER_ID,USER_ID.USER_ID_TYPE,USER_ID.USER_ID_VALUE);
for (String userId : subscriptionDTO.getUserId())
insertUserIds = insertUserIds.values(getValue(0,userId),getValue(1,userId));
InsertReturningStep insertReturningUserIds = insertUserIds.onConflictDoNothing();
InsertResultStep insertReturningSubscription = insertInto(SUBSCRIPTION)
.set(SUBSCRIPTION.CHANNEL_ID,subscriptionDTO.getChannel())
.set(SUBSCRIPTION.SENDER_ID,subscriptionDTO.getSenderId())
.set(SUBSCRIPTION.CATEGORY_ID,subscriptionDTO.getCategory())
.set(SUBSCRIPTION.TOKEN,subscriptionDTO.getToken())
.onConflictDoNothing()
.returningResult(SUBSCRIPTION.ID);
不幸的是,要向关联表中插入值,我尝试了很多方法,但对我没有任何帮助,最后,我尝试通过select插入SUBSCRIPTION_USER_ID
中的值,但不起作用:
InsertValuesStep insertValuesSubscriptionUserIds = insertInto(
SUBSCRIPTION_USER_ID,SUBSCRIPTION_USER_ID.SUBSCRIPTION_ID,SUBSCRIPTION_USER_ID.USER_ID_ID)
.select(select(SUBSCRIPTION.ID,USER_ID.ID)
.from(SUBSCRIPTION)
.innerJoin(USER_ID)
.on(concat(USER_ID.USER_ID_TYPE,val(CATEGORY_USER_ID_DELIMITER),USER_ID.USER_ID_VALUE).in(subscriptionDTO.getUserId())
.and(SUBSCRIPTION.SENDER_ID.equal(subscriptionDTO.getSenderId()))
.and(SUBSCRIPTION.CHANNEL_ID.equal(subscriptionDTO.getChannel()))
.and(SUBSCRIPTION.CATEGORY.equal(subscriptionDTO.getCategory()))
.and(SUBSCRIPTION.TOKEN.equal(subscriptionDTO.getToken()))));
我想念上面的东西吗?是否有更好的方法使用JOOQ插入多对多关系值或将查询结果用作其他查询的参数?
解决方法
我假设您发布了整个代码。如果发生以下情况:
您不会在插入 a b c d e f alpha beta gamma
0 -0.725042 -0.756909 0.070109 0.850219 1.792450 1.324259 -1.450084 -3.784547 0.420656
1 -0.062379 -0.105332 -1.222571 -1.297675 -0.514850 0.610115 -0.124758 -0.526659 -7.335425
2 1.396269 -0.602535 0.033669 1.190688 0.335367 1.287264 2.792537 -3.012675 0.202014
3 0.303298 -2.016903 0.748448 0.317952 -0.319775 -1.023614 0.606595 -10.084517 4.490689
4 -0.469161 -2.133385 -0.488404 1.322836 0.560578 1.436018 -0.938321 -10.666927 -2.930423
5 -0.177657 -1.065320 -0.103551 0.406531 0.128109 0.387128 -0.355314 -5.326601 -0.621305
时调用execute
只需添加
USER_ID
或者,也可以使用对insertUserIds.onConflictDoNothing().execute();
的调用来获取生成的ID
内部加入
这可能只是一个样式问题,但是您似乎正在做的是交叉联接。您的returning().fetch()
过滤器并不是真正的联接谓词。我将它们放在INNER JOIN
子句中。明确性可能有助于避免此类查询出现进一步的问题。
具体来说,第一个“ join predicate”非常混乱,包含一个WHERE
调用,这不是每天在CONCAT
中都会看到的,并且仅涉及一个表,而不能同时涉及两个表:
INNER JOIN
错误的谓词
最后一个谓词似乎是错误的。您要插入:
.on(concat(USER_ID.USER_ID_TYPE,val(CATEGORY_USER_ID_DELIMITER),USER_ID.USER_ID_VALUE).in(subscriptionDTO.getUserId())
但是您正在查询
.set(SUBSCRIPTION.TOKEN,subscriptionDTO.getToken())
可能应该再次.and(SUBSCRIPTION.TOKEN.equal(subscriptionDTO.getContactId()))));
如上所述,我已经为SUBSCRIPTION
和USER_ID
表插入了值。并获取关联表,我需要从上面的两个表中获取已经插入的值的ID,因此,为了解决此问题,我已使用此查询插入SUBSCRIPTION_USER_ID
中:
InsertReturningStep insertReturningSubscriptionUserId = insertInto(
SUBSCRIPTION_USER_ID,SUBSCRIPTION_USER_ID.SUBSCRIPTION_ID,SUBSCRIPTION_USER_ID.USER_ID_ID)
.select(select(SUBSCRIPTION.ID,USER_ID.ID).from(SUBSCRIPTION
.where(concat(USER_ID.USER_ID_TYPE,USER_ID.USER_ID_VALUE).in(subscriptionDTO.getUserId()))
.and(SUBSCRIPTION.SENDER_ID.equal(subscriptionDTO.getSenderId()))
.and(SUBSCRIPTION.CHANNEL_ID.equal(subscriptionDTO.getChannel()))
.and(SUBSCRIPTION.CATEGORY.equal(subscriptionDTO.getCategory()))
.and(SUBSCRIPTION.TOKEN.equal(subscriptionDTO.getToken()))).onConflictDoNothing();
最后,我使用batch
执行了所有查询:
using(configuration).batch(insertReturningSubscription,insertReturningUserIds,insertReturningSubscriptionUserId).execute()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。