QueryDSL:如何插入或更新?

时间:2013-09-15 19:45:35

标签: h2 querydsl

我试图为名为"模块"的表格实施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

  1. 为什么QueryDSL会插入from dual?我希望它完全省略from
  2. 如何解决此问题?

1 个答案:

答案 0 :(得分:3)

对于插入选择表单,请使用

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

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

使用InsertClause.set(...)您无法获得您想要的条件插入。

换句话说

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

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

set(...)

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