关于@Table的一个Bug

在使用javax.persistence.Table注解时,遇到一个bug,仅指定schema而不提供name会导致表名无法识别。经过调试,发现在tkmybatis的内部处理中,当@Table注解缺少name属性时,其作用并未生效。问题在于解析实体时,如果@Table没有指定name,系统会忽略schema信息,从而导致表名找不到。解决方案是确保@Table同时包含schema和name属性。
摘要由CSDN通过智能技术生成

今天发现了javax.persistence.Table 的一个bug。

  • 问题
    我在写注解的时候用@Table(schema = “audit”)的时候,只写了shcema,没有写name。运行的时候,一直报表名找不到,@Table根本没有生效。

  • 结论
    原因是我没有写name这个属性,也就是说要这样写@Table(schema = “audit”, name=“tableName”),原因在下方。

  • 过程
    网上也没有相关的说法,我只能自己查。我用的是tkmybatis的selectByExample方法。所以我们从这里开始调。

/**
 * 通用Mapper接口,Example查询
 *
 * @param <T> 不能为空
 * @author liuzh
 */
@tk.mybatis.mapper.annotation.RegisterMapper
public interface SelectByExampleMapper<T> {

    /**
     * 根据Example条件进行查询
     *
     * @param example
     * @return
     */
    @SelectProvider(type = ExampleProvider.class, method = "dynamicSQL")
    List<T> selectByExample(Object example);

}

找到之后,点进ExampleProvider的selectByExample

/**
     * 根据Example查询
     *
     * @param ms
     * @return
     */
    public String selectByExample(MappedStatement ms) {
        Class<?> entityClass = getEntityClass(ms);
        //将返回值修改为实体类型
        setResultType(ms, entityClass);
        StringBuilder sql = new StringBuilder("SELECT ");
        if (isCheckExampleEntityClass()) {
            sql.append(SqlHelper.exampleCheck(entityClass));
        }
        sql.append("<if test=\"distinct\">distinct</if>");
        //支持查询指定列
        sql.append(SqlHelper.exampleSelectColumns(entityClass));
        sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));
        sql.append(SqlHelper.exampleWhereClause());
        sql.append(SqlHelper.exampleOrderBy(entityClass));
        sql.append(SqlHelper.exampleForUpdate());
        return sql.toString();
    }

因为是找不到表,所以应该是

 sql.append(SqlHelper.fromTable(entityClass, tableName(entityClass)));

这行或之前出现的问题,点进fromTable

/**
     * from tableName - 动态表名
     *
     * @param entityClass
     * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值