Mybaitis之Could not find SQL statement ...Base_Column_LIst'

本文详细解析了在使用Mybatis框架时遇到的SQL包含异常问题,通过具体案例分析,指出错误信息“找不到要与refid一起包含的SQL语句”可能的原因及解决方案,包括检查ID拼写、代码段位置和大小写敏感性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先抛出异常如下

org.apache.ibatis.builder.IncompleteElementException: Could not find SQL statement to include with refid 'com.example.demo.Mapper.TargetDimensionMapper.Base_Column_LIst'
    at org.apache.ibatis.builder.xml.XMLIncludeTransformer.findSqlFragment(XMLIncludeTransformer.java:99)
    at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:61)
    at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:83)
    at org.apache.ibatis.builder.xml.XMLIncludeTransformer.applyIncludes(XMLIncludeTransformer.java:51)
    at org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode(XMLStatementBuilder.java:88)
    at org.apache.ibatis.session.Configuration.lambda$buildAllStatements$2(Configuration.java:787)
    at java.util.Collection.removeIf(Unknown Source)
    at org.apache.ibatis.session.Configuration.buildAllStatements(Configuration.java:786)
    at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:763)
    at org.apache.ibatis.session.Configuration.hasStatement(Configuration.java:758)
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.resolveMappedStatement(MapperMethod.java:254)
    at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:224)
    at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:50)
    at org.apache.ibatis.binding.MapperProxy.lambda$cachedMapperMethod$0(MapperProxy.java:62)
    at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(Unknown Source)
    at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:62)
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57)
    at com.sun.proxy.$Proxy64.selectAllDimension(Unknown Source)
    at com.example.demo.service.impl.Dimension_Service.selectallDemention(Dimension_Service.java:75)
    at com.example.demo.Controller.TargetDimension_Controller.SelectAlldimension(TargetDimension_Controller.java:76)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:189)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)
......(后面不贴了,太长了)

什么意思呢?“找不到要与refid一起包含的SQL语句”,先检查一下自己的Mapper.xml映射文件。

自己再网上查找后说有两个原因:

1.确实没有id为“xxx”的sql代码段

        1.1 标签名写错

        1.2 id名写错了

2. 确实有id为“xxx”的sql代码段

        可能是代码段放置的位置有问题,被引用代码段应该放在引用的代码片段之前,原因是Mybatis用的是sax解析。

到这里基本上可以解决大多数人的问题了,然而我的问题还没结束

好了,检查了一下我自己的:

<sql id="Base_Column_List">
    DIMENSION_ID, DIMENSION_CODE, DIMENSION_NAME, DIMEMSION_GROUP, DIMENSION_DESCRIBE,DIMENSION_STATE, UPDATE_LAST, UPDATE_TIME
</sql>

下面的使用:

<select id="selectAllDimension" resultMap="BaseResultMap">
    select 
    <include refid="Base_Column_List" />
    from target_dimension_table
  </select>

好像没什么问题,别的地方也没有弄错,怎么回事呢,又看了一眼报错:

 

Could not find .......Base_Column_LIst'

 

nnd,我没又用到这个玩意好吧?我的是“Base_Column_List”,List! List!好吧好吧,你这样我就把上面那个改成大写,

<sql id="Base_Column_LIst">
    DIMENSION_ID, DIMENSION_CODE, DIMENSION_NAME, DIMEMSION_GROUP, DIMENSION_DESCRIBE,DIMENSION_STATE, UPDATE_LAST, UPDATE_TIME
</sql>

这总可以了吧,结果。。。。。。。。。。。。。。。。。。。。。。。

Could not find SQL statement to include with refid 'com.example.demo.Mapper.TargetDimensionMapper.Base_Column_List'

??????

无FUCK可说,简单粗暴,两个都加上!!!

运行,postman访问,出结果:

好吧,完成,Mybatis奇奇怪怪的问题

<think>我们正在分析用户提供的SQL语句,该语句尝试创建一个物化表(Materialized Table),但遇到了解析错误:`ParseException: Encountered "policy_id" at line 2, column 5`。这个错误通常表示SQL语法存在问题,解析器在预期某个关键字或结构时遇到了列名`policy_id`。 ### 错误分析 1. **语法结构问题**:在Flink SQL中,创建物化视图(Materialized View)的标准语法是`CREATE MATERIALIZED VIEW ... AS SELECT ...`,而用户使用的是`CREATE MATERIALIZED TABLE ...`。Flink目前没有`CREATE MATERIALIZED TABLE`这样的语法,这可能是导致解析错误的主要原因[^1]。 2. **列定义位置**:在`CREATE TABLE`语句中,列定义应该直接跟在表名后的括号内,但用户语句中在表名后直接列出了列名,这符合常规的`CREATE TABLE`语法。然而,由于使用了`MATERIALIZED`关键字,解析器可能在此处产生了混淆。 3. **Paimon连接器使用**:用户使用了`WITH('connector'='paimon')`,这表明他们希望创建一个Paimon表。Paimon支持创建表,但不支持`MATERIALIZED TABLE`语法。 ### 修正建议 #### 方案1:创建普通Paimon表(非物化视图) 如果用户的目标是创建一个Paimon表(物理表),那么应该使用标准的`CREATE TABLE`语法,并移除`MATERIALIZED`关键字: ```sql CREATE TABLE catalog_jp.dwd.tb_agrt_policy_curr_dim_materialized3 ( policy_id VARCHAR(2147483647) NOT NULL, -- 注意:主键列必须显式声明NOT NULL -- ... 其他列定义 ... PRIMARY KEY (policy_id) NOT ENFORCED ) WITH ( 'connector' = 'paimon' ); ``` #### 方案2:创建物化视图(Materialized View) 如果用户希望创建的是一个物化视图(即由查询定义并自动刷新的表),则应使用`CREATE MATERIALIZED VIEW`语法: ```sql CREATE MATERIALIZED VIEW catalog_jp.dwd.tb_agrt_policy_curr_dim_materialized3 WITH ( 'connector' = 'paimon' ) FRESHNESS = INTERVAL '10' MINUTE REFRESH_MODE = CONTINUOUS AS SELECT policy_id, source_policy_id, -- ... 其他列 ... FROM your_source_table; -- 必须提供实际的查询语句 ``` ### 关键修改点 1. **移除`MATERIALIZED TABLE`**:统一使用`CREATE TABLE`(物理表)或`CREATE MATERIALIZED VIEW`(物化视图)语法。 2. **主键列非空约束**:在Flink中,作为主键的列必须显式声明为`NOT NULL`(如方案1所示)。 3. **物化视图必须包含查询**:使用`AS SELECT ...`子句定义视图的数据来源(如方案2所示)。 ### 注意事项 - **Paimon表的主键**:在Paimon中定义主键时,必须使用`PRIMARY KEY (...) NOT ENFORCED`语法[^3]。 - **物化视图的刷新**:`FRESHNESS`和`REFRESH_MODE`是Flink物化视图的配置,用于定义刷新策略(如方案2所示)。 - **列长度限制**:`VARCHAR(2147483647)`在Flink中可能被解释为最大长度(约2GB),但实际存储时Paimon可能有内部优化。 ### 验证步骤 1. 检查语法是否符合Flink SQL标准。 2. 确保主键列明确标记为`NOT NULL`。 3. 对于物化视图,确保提供有效的`SELECT`查询。 ### 相关问题 1. Flink SQL中`CREATE TABLE`和`CREATE MATERIALIZED VIEW`的主要区别是什么? 2. 如何在Paimon表中配置分区和分桶(bucketing)? 3. Flink物化视图的连续刷新(CONTINUOUS)和全量刷新(FULL)有何不同? 4. Paimon表支持哪些类型的索引? 5. 如何监控Paimon表的压缩(compaction)状态? 6. 在Flink中,物化视图的增量刷新是如何实现的? 7. 如何处理物化视图中的迟到数据(late data)? 通过以上修正,用户应该能够成功创建所需的表或视图结构。如果问题仍然存在,建议检查Flink和Paimon的版本兼容性,并确保使用的连接器支持所需功能。 [^1]: Flink SQL语法文档中明确区分了`CREATE TABLE`和`CREATE MATERIALIZED VIEW`两种结构。 [^3]: Paimon官方文档强调主键必须使用`NOT ENFORCED`声明,并且主键列必须非空。</think>### 问题分析:CREATE MATERIALIZED TABLE 语法错误 您遇到的 `ParseException: Encountered "policy_id" at line 2, column 5` 错误是由于 Flink SQL 不支持 `CREATE MATERIALIZED TABLE` 语法造成的。Flink SQL 的物化视图语法与标准 SQL 有差异,主要问题如下: 1. **语法结构错误**: - Flink 不支持 `CREATE MATERIALIZED TABLE` 语法 - 正确语法应为: ```sql CREATE MATERIALIZED VIEW [IF NOT EXISTS] [catalog_name.][db_name.]view_name [PARTITIONED BY (partition_col_name1, partition_col_name2, ...)] [COMMENT view_comment] [FRESHNESS = freshness_definition] [REFRESH_MODE refresh_mode] AS SELECT ...; ``` 2. **主键声明问题**: - Flink 物化视图不支持 `PRIMARY KEY` 约束 - 主键应通过 `AS SELECT` 查询中的逻辑保证 3. **WITH 子句位置错误**: - Paimon 连接器配置应放在 `WITH` 子句中,但需作为物化视图属性 ### 修正后的语法 ```sql CREATE MATERIALIZED VIEW catalog_jp.dwd.tb_agrt_policy_curr_dim_materialized3 WITH ( 'connector' = 'paimon', 'path' = 'hdfs:///path/to/paimon/warehouse' -- 需指定实际存储路径 ) FRESHNESS = INTERVAL '10' MINUTE REFRESH_MODE = CONTINUOUS AS SELECT policy_id, source_policy_id, main_policy_owner_id, -- 其他字段... etl_source_system, etl_source_table, data_arrival_time, dwd_data_arrival_time FROM your_source_table -- 必须替换为实际数据源表 WHERE policy_id IS NOT NULL; -- 确保主键非空 ``` ### 关键修改点说明 1. **语法结构修正**: - 使用 `CREATE MATERIALIZED VIEW` 替代 `CREATE MATERIALIZED TABLE` - 移除 `PRIMARY KEY` 约束(Flink 物化视图不支持) - 将 `WITH` 子句移到视图定义后 2. **主键处理**: ```sql WHERE policy_id IS NOT NULL -- 在源数据层保证主键非空 ``` 3. **Paimon 连接器必备参数**: - `path`:必须指定 Paimon 的实际存储路径 - 建议添加分桶配置(优化性能): ```sql WITH ( ... 'bucket' = '4', -- 分桶数量 'bucket-key' = 'policy_id' -- 分桶键 ) ``` 4. **数据源要求**: - `AS SELECT` 必须指定实际数据源表 - 建议创建中间视图处理数据: ```sql CREATE VIEW cleaned_policy_data AS SELECT COALESCE(policy_id, 'N/A') AS policy_id, -- 空值处理 ... FROM source_table; CREATE MATERIALIZED VIEW ... AS SELECT * FROM cleaned_policy_data; ``` ### 验证步骤 1. **检查语法有效性**: ```sql EXPLAIN CREATE MATERIALIZED VIEW ... AS SELECT ...; ``` 2. **验证主键唯一性**: ```sql SELECT policy_id, COUNT(1) FROM materialized_view GROUP BY policy_id HAVING COUNT(1) > 1; ``` 3. **检查刷新状态**: ```sql SHOW MATERIALIZED VIEWS; -- 查看物化视图状态 ``` ### 相关问题 1. Flink SQL 中物化视图(Materialized View)与传统数据库物化视图有何区别? 2. 如何在 Paimon 表上配置自动压缩(compaction)策略? 3. Flink 连续刷新(CONTINUOUS REFRESH)模式的工作原理是什么? 4. 如何监控 Flink 物化视图的数据延迟? 5. Paimon 表支持哪些类型的索引?如何创建二级索引? 6. 在流式数据场景下,如何保证物化视图的主键唯一性? 7. Flink SQL 的 `FRESHNESS` 参数有哪些可配置选项?如何配置事件时间刷新? > 提示:在分布式环境中创建物化视图时,确保所有节点使用相同的全局唯一标识符非常重要,这可以避免数据不一致问题[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值