我试图为名为"模块"的表格实施https://stackoverflow.com/a/16392399/14731使用QueryDSL。这是我的疑问:
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
。
from dual
?我希望它完全省略from
。答案 0 :(得分:3)
对于插入选择表单,请使用
columns(...).select(...)
但是你的错误表明INSERT子句是有效的,但在语义上并不是你想要的。
使用InsertClause.set(...)
您无法获得您想要的条件插入。
换句话说
columns(...).select(...)
您将完整的结果集映射到INSERT模板中,并且不会为空结果集插入任何行,但使用
set(...)
将查询结果映射到INSERT模板的单个列,空值将用于空结果。