我正在运行一个Camel路由,它从数据库中读取一个标记记录。如果标记不在那里,则插入它并执行一些额外的操作。我希望能够检查查询的结果集是否为空,但我在路由(选择)中使用的条件似乎被忽略了,所以它的工作方式就像它总是在数据库中找到一些东西,即使我确定它不是(事实上,日志记录${body}显示为空)。
我使用的是spring XML DSL,路径如下:
<from uri="file:/D:/LOCAL/?include=(?i).*.zip&moveFailed=ErrorFiles&move=D:/LOCAL/WRK/"/> <!--Catch a zip file as trigger for route-->
<to uri="sql:SELECT LOAD_DATE FROM IMPORT_CUSTOMER_CTRL WHERE LOAD_DATE = CURRENT_DATE?datasource=#customerDS&routeEmptyResultSet=true&outputType=SelectOne"/> <!-- Read a flag record from db -->
<log message="Query result: ${body}" loggingLevel="INFO"/>
<choice>
<when>
<simple>${body)} == null</simple> <!--IF RESULTSET IS EMPTY THEN DO SOMETHING. THIS CONDITION FAILS AND ALWAYS GOES BY OTHERWISE BRANCH-->**strong text**
<log message="Do something" loggingLevel="INFO"/>
<!--Insert flag record -->
<to uri="sql:INSERT INTO IMPORT_CUSTOMER_CTRL (LOAD_DATE) VALUES(CURRENT_DATE)?dataSource=#customerDS" />
</when>
<otherwise>
<log message="Flag record already exists, ignoring:${body}" loggingLevel="INFO"/>
</otherwise>
</choice>
对于when条件,我已经尝试了***${body)} == null***和***${body)} =='甚至${bodyAs(String)} =='***,但是choice的行为总是被填充,并通过其他路径。我知道原因是我总是在日志中得到“Flag record already exists..”消息。
评估结果集是否为空的正确方法是什么?
2条答案
按热度按时间8xiog9wr1#
根据Sql组件文档:
对于select操作,结果是List〈Map〈String,Object〉〉类型的示例,由JdbcTemplate.queryForList()方法返回。
因此,
body
永远不会是null
--您必须检查返回的List
对象的内容,以查看结果集包含的内容。下面是一条完整的路线,它对
body
进行了多次检查:当路线运行时,它将打印
或
这取决于
List
是否具有项。tzdcorbm2#
你能把你的评论作为答案贴出来吗,这样我就可以把它标记为被接受的答案了
正如上面所解释的,无论输出类型如何(我指的是列表和单个元组),一个通用的解决方案都是分析Camel以header形式发布的各种“元数据”:https://camel.apache.org/components/3.17.x/sql-component.html#_message_headers
您应该特别查看一下
CamelSqlRowCount
,正如它的名称所示,它将给予有关SQL查询返回的记录数的信息。