gpt4 book ai didi

h2 - QueryDSL:如何插入或更新?

转载 作者:行者123 更新时间:2023-12-04 04:41:30 25 4
gpt4 key购买 nike

我正在尝试实现 https://stackoverflow.com/a/16392399/14731对于使用 QueryDSL 的名为“Modules”的表。这是我的查询:

String newName = "MyModule";
QModules modules = QModules.modules;
BooleanExpression moduleNotExists = session.subQuery().
from(modules).where(modules.name.eq(newName)).notExists();
SimpleSubQuery<String> setModuleName = session.subQuery().
where(moduleNotExists).unique(Expressions.constant(newName));
long moduleId = session.insert(modules).set(modules.name, setModuleName).
executeWithKey(modules.id);

我希望这能转化为:
insert into modules(name)
select 'MyModule'
where not exists
(select 1 from modules where modules.name = 'MyModule')

相反,我得到:
NULL not allowed for column "NAME"; SQL statement:
insert into MODULES (NAME)
values ((select ?
from dual
where not exists (select 1
from MODULES MODULES
where MODULES.NAME = ?)))

哪里 ?等于 MyModule .
  • 为什么QueryDSL插入from dual ?我期待它省略 from一共。
  • 如何修复此查询?
  • 最佳答案

    对于插入到选择表单中使用

    columns(...).select(...)

    但是您的错误表明 INSERT 子句是有效的,但在语义上不是您想要的。

    使用 InsertClause.set(...)你没有得到你想要的条件插入。

    换句话说
    columns(...).select(...)

    您将完整的结果集映射到 INSERT 模板中,并且不会为空的结果集插入任何行,但是使用
    set(...)

    您将查询结果映射到 INSERT 模板的单个列,空值将用于空结果。

    关于h2 - QueryDSL:如何插入或更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18816748/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com