abel533 / Mapper

Mybatis Common Mapper - Easy to use
https://mybatis.io
MIT License
7.33k stars 1.63k forks source link

Weekend.setTableName("t_table force index(index_name)")不生效 #761

Open maheng-hub opened 4 years ago

maheng-hub commented 4 years ago

如题,有个SQL没有走索引,所以想改一下表名强制走索引,但这样写以后还是原来的表名,setTableName的时候有什么注意事项吗

maheng-hub commented 4 years ago

自己回答:

即使我们的参数Weekend已经实现IDynamicTableName,但动态拼表名的前提条件时entity也实现这个接口:

    /**
     * 获取表名 - 支持动态表名
     *
     * @param entityClass
     * @param tableName
     * @return
     */
    public static String getDynamicTableName(Class<?> entityClass, String tableName) {
        if (IDynamicTableName.class.isAssignableFrom(entityClass)) {
            StringBuilder sql = new StringBuilder();
            sql.append("<choose>");
            sql.append("<when test=\"@tk.mybatis.mapper.util.OGNL@isDynamicParameter(_parameter) and dynamicTableName != null and dynamicTableName != ''\">");
            sql.append("${dynamicTableName}\n");
            sql.append("</when>");
            //不支持指定列的时候查询全部列
            sql.append("<otherwise>");
            sql.append(tableName);
            sql.append("</otherwise>");
            sql.append("</choose>");
            return sql.toString();
        } else {
            return tableName;
        }
    }

这里有点问题,如果要使用动态表名的话,entity必须实现IDynamicTableName接口,而我们的参数Weekend,实现了这个接口,因此,个人感觉,entity实现IDynamicTableName不是动态拼接表名的必要条件,只要我们的参数_parameter实现这个接口即可