Как написать mybatis mapper для этой вставки во временную таблицу, созданную между ними?
Я пытаюсь написать mapper, используя аннотацию mybatis для следующего экстракта sql:
CREATE TEMP TABLE XYZ
.
/* Something */
.
CREATE TEMP TABLE ABC
as
Select ptype,pvalue,id,djob
from XYZ
where pvalue> 0
and CASE WHEN djob = ptype
then pvalue = d_job_partition_value END;
Insert into ABC
Select ptype,pvalue,id,djob
from XYZ
where
CASE WHEN ptype = 'region' AND d_job_partition_type = 'region'
THEN pvalue in (Select distinct CAST(region_id as NUMERIC(38,0)) from {db}.{table} where region_id=d_job_partition_value) END;
Класс картографа, который я пытался написать, имея в виду, что ABC
это временная таблица, созданная между ними.
@Select("with XYZ as
(
/* Something */
),
ABC as (
Select ptype,pvalue,id,djob
from XYZ
where pvalue> 0
and CASE WHEN djob = ptype
then pvalue = d_job_partition_value END),
insert into ABC
(ptype,pvalue,id,djob) values(
Select ptype,pavalue,id,djob
from XYZ
CASE WHEN ptype = 'region' AND d_job_partition_type = 'region'
THEN pvalue in (Select distinct CAST(region_id as NUMERIC(38,0)) from {db}.{table}
where region_id=d_job_partition_value) END ")
Ошибка:
ERROR: syntax error at or near "into"
[junit] Position: 5828
[junit] at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
[junit] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
[junit] at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
[junit] at org.apache.ibatis.session.SqlSessionManager$SqlSessionInterceptor.invoke(SqlSessionManager.java:282)
[junit] at com.sun.proxy.$Proxy28.selectList(Unknown Source)
[junit] at org.apache.ibatis.session.SqlSessionManager.selectList(SqlSessionManager.java:171)
[junit] at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
[junit] at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
[junit] at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
[junit] at com.sun.proxy.$Proxy29.okey(Unknown Source)
Я знаю что @Insert
используется для вставки значений. Но в этом случае создание временной таблицы создает проблему.
Заранее спасибо.
1 ответ
Вы можете указать несколько операторов (включая создание временной таблицы) в @Insert
аннотация к методу картографа:
@Insert(
"create temp table xyz as select * from whatever; " +
"CREATE TEMP TABLE ABC as Select ptype,pvalue,id,djob from XYZ;" +
"Insert into ABC Select ptype,pvalue,id,djob from XYZ;"
)
void insertMultiple();
Это решение работает не только в postgres. Я проверял, он работает и с H2.
Обратите внимание, что вариант, который вы пробуете, а именно CTE akawith
-query не создает временную таблицу.
Они выглядят как временная таблица, и даже в документации говорится, что они can be thought of as defining temporary tables that exist just for one query
но это только для пояснительных целей. Это не временные таблицы, и важным отличием является то, что в эти вспомогательные операторы невозможно выполнить вставку.