Java mybatis@Select带有sql关键字的静态工厂编译时出错?
当我使用@Select时,它是ibatis的注释,代码如下:Java mybatis@Select带有sql关键字的静态工厂编译时出错?,java,spring,compiler-errors,mybatis,Java,Spring,Compiler Errors,Mybatis,当我使用@Select时,它是ibatis的注释,代码如下: @Select({"SELECT ", selectField, " FROM ", table, "WHERE finished = #{finished}"}) List<ToDo> listToDoByFinished(@Param("finished") Integer finished); SqlFactory中定义的sql关键字: package me.freezehome.blog.factory; p
@Select({"SELECT ", selectField, " FROM ", table, "WHERE finished = #{finished}"})
List<ToDo> listToDoByFinished(@Param("finished") Integer finished);
SqlFactory
中定义的sql关键字:
package me.freezehome.blog.factory;
public class SqlFactory {
private SqlFactory(){}
public static final String SELECT = " SELECT ";
public static final String INSERT = " INSERT ";
public static final String UPDATE = " UPDATE ";
public static final String DELETE = " DELETE ";
public static final String WHERE = " WHERE ";
public static final String FROM = " FROM ";
public static final String AND = " AND ";
public static final String OR = " OR ";
public static final String IN = " IN ";
public static final String INTO = " INTO ";
public static final String VALUES = "VALUES";
public static final String EQUAL = " = ";
}
接口中定义的其他:
package me.freezehome.blog.dao;
import me.freezehome.blog.driver.MyInLanguageDriver;
import me.freezehome.blog.model.ToDo;
import org.apache.ibatis.annotations.*;
import java.util.List;
import static me.freezehome.blog.config.StringConfig.strSeparator;
import static me.freezehome.blog.factory.SqlFactory.*;
public interface ToDoDAO {
String table = "todo";
String id = "id";
String title = "title";
String content = "content";
String finished = "finished";
String selectField = id + strSeparator + title + strSeparator + content + strSeparator + finished;
String insertField = title + strSeparator + content;
}
其他信息:
- mybatis 3.4.1
- mybatis spring 1.3.0
- 春季4.3.3
- mavne 3.3.9
- java“1.8.0_111” Java(TM)SE运行时环境(build 1.8.0_111-b14) Java HotSpot(TM)64位服务器虚拟机(构建25.111-b14,混合模式)
在ToDoDAO接口中,所有字符串都应该是静态的,因为注释需要常量参数。我已经在我的小应用程序上尝试了这段代码。因此,Java编译器将尝试引用与常量同名的方法参数 在这种情况下,Java编译器将尝试引用方法参数(
finished
定义为Integer
),而不是String finished=“finished”代码>(常数)。因此,在编译时发生类型转换错误
我不知道它是否是Java编译器上的规范
您可能可以通过将常量名称转换为大写来解决此问题 为什么?SqlFactory的变量都是静态的final。ToDoDAO接口的变量不是但必须是,但为什么我不能导入静态SqlFactory。*?不,你必须导入静态me.freezehome.blog.factory.SqlFactory.
才能编译,只是告诉你,因为它不在你的代码段中。对不起,没有粘贴所有代码是我的错。我有更新代码是的,我用大写字母解决它,但我不能理解。
package me.freezehome.blog.factory;
public class SqlFactory {
private SqlFactory(){}
public static final String SELECT = " SELECT ";
public static final String INSERT = " INSERT ";
public static final String UPDATE = " UPDATE ";
public static final String DELETE = " DELETE ";
public static final String WHERE = " WHERE ";
public static final String FROM = " FROM ";
public static final String AND = " AND ";
public static final String OR = " OR ";
public static final String IN = " IN ";
public static final String INTO = " INTO ";
public static final String VALUES = "VALUES";
public static final String EQUAL = " = ";
}
package me.freezehome.blog.dao;
import me.freezehome.blog.driver.MyInLanguageDriver;
import me.freezehome.blog.model.ToDo;
import org.apache.ibatis.annotations.*;
import java.util.List;
import static me.freezehome.blog.config.StringConfig.strSeparator;
import static me.freezehome.blog.factory.SqlFactory.*;
public interface ToDoDAO {
String table = "todo";
String id = "id";
String title = "title";
String content = "content";
String finished = "finished";
String selectField = id + strSeparator + title + strSeparator + content + strSeparator + finished;
String insertField = title + strSeparator + content;
}