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

标签 h2 querydsl

我正在尝试实现 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

  1. 为什么 QueryDSL 插入从双重?我希望它完全省略 from
  2. 如何解决此查询?

最佳答案

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

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

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

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

换句话说

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

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

set(...)

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

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

相关文章:

spring-boot - 未找到 H2 数据库

java - 使用java更改h2数据库创建位置

java - 基本的 ORMLite 数据库问题

java - Flyway + h2内存数据库+ hibernate +测试导致表不存在

java - 如何使用 JOOQ 或任何其他库使用以下数据构建方言敏感的 SQL 查询?

java - 如何避免单元测试中出现OptimisticLockException?

java - 更改 QueryDSL 生成的文件目录

java - 如何在没有域类的querydsl中构造查询

java - 带join的Querydsl实体继承查询