使用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

如何解决使用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

我的数据库中有三个表SUBSCRIPTIONUSER_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()))));

,

如上所述,我已经为SUBSCRIPTIONUSER_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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-