【发布时间】:2019-06-27 05:02:14
【问题描述】:
我有以下代码:
@RegisterMapper(MyEntity.ResultMapper.class)
@UseStringTemplate3StatementLocator
public interface MyDao {
@Transaction(TransactionIsolationLevel.SERIALIZABLE)
@SqlBatch("INSERT INTO mySchema.myTable (" +
" id, entity_type, entity_id, flags " +
" ) VALUES " +
"(" +
" :stepId , :entityType , :entityId,parse_json(:flags) " +
")")
@BatchChunkSize(500)
Object create( @BindBean List<MyEntity> entities );
}
如您所见,我正在使用此 DAO 将实体列表批量插入到我的 Snowflake 表中。
问题是我无法插入标志列,这是一个变体。我试过to_variant(:flags) 和当前parse_json(:flags),但JDBI 不断抛出以下错误:
net.snowflake.client.jdbc.SnowflakeSQLException: SQL
compilation error:
Invalid expression [PARSE_JSON(?)] in VALUES clause
[statement:"INSERT INTO mySchema.myTable ( id, entity_type,
entity_id, flags ) VALUES ( :stepId , :entityType , :entityId,
parse_json(:flags) )", located:"null", rewritten:"null",
arguments:{ positional:{}, named:{timeStamp:'null',
entityType:MYENTITY,
flags:'{"client":"myClient","flow":"myFlow"}',stepId:null,
entityId:'189643357241513', class:class myOrg.MyEntity}, finder:[]}]
我应该如何传递标志列中的值?有没有人尝试过这个? MyEntity 中的 flags 字段由我控制,我可以将其保留为 POJO 或字符串,以帮助我解决此问题。
【问题讨论】:
-
尝试将您的插入语句重写为:INSERT INTO T SELECT parse_json(:flag);
-
@JianshengHuang,非常感谢先生。这行得通。您为什么不将其发布为答案?
-
@JianshengHuang,新的插入查询是否也适用于SqlBatch?在我看来,现在对于我的 250 个实体列表,一次插入一个。
-
您遇到的当前行为是我们今天不支持除 INSERT INTO T VALUES () 之外的任何 DML 的批处理/数组绑定。如果这对您的业务至关重要,请向 Snowflake 提交支持请求,以便我们优先考虑。
-
@JianshengHuang,好吧,我们还是搬到了 RDS。但是库是否可以抛出异常或让调用者以某种方式知道 SqlBatch 注释由于不支持的插入查询而不起作用?
标签: dao jdbi snowflake-cloud-data-platform