2017-03-02 6 views
0

私はコードでのiBATISの注釈である@Select使用する場合:mybatis @Selectキーワードの静的ファクトリで@Selectコンパイル時にエラーが発生しますか?

@Select({"SELECT ", selectField, " FROM ", table, "WHERE finished = #{finished}"}) 
List<ToDo> listToDoByFinished(@Param("finished") Integer finished); 

それは右動作してコンパイルすることができますが、私は、コードを変更すると、次のとおりです。

//FIXME 
@Select({SELECT, selectField, FROM, table, WHERE, finished, EQUAL, "#{finished}"}) 
List<ToDo> listToDoByFinished(@Param("finished") Integer finished); 

それはコンパイルすることはできませんが通って、エラー情報は次のとおりです。

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.2:compile (default-compile) on project blog: Compilation failure 
[ERROR] /home/freeze/my_project/lbfreeze-blog/src/main/java/me/freezehome/blog/dao/ToDoDAO.java:[32,54] 错误(error): 不兼容的类型(type mismatch): Integer无法转换为String(Interger cannot convert to String) 
[ERROR] -> [Help 1] 
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. 
[ERROR] Re-run Maven using the -X switch to enable full debug logging. 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles: 
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException 

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のスプリング1.3.0
  • スプリング4.3.3
  • mavne 3.3.9
  • Javaの "1.8.0_111" のJava(TM)SEランタイム環境(1.8.0_111-B14を構築) は、Java HotSpot(TM)64ビットサーバーVM(25.111-B14、混合モードを構築する)

答えて

0

私の小さなアプリケーションでこのコードを試しました。その結果、Javaコンパイラは、定数と同じ名前のメソッド引数を参照しようとします。

この場合、Javaコンパイルでは、String finished = "finished";(定数)ではなく、メソッド引数(finishedIntegerと定義されています)を参照しようとします。コンパイル時に型変換エラーが発生します。

Javaコンパイラで仕様書であるかどうかわかりません。

おそらく、定数名を大文字に変換することでこの問題を解決できます。

+0

はい、解決します大文字を使っていますが、分かりません。 –

0

私は静的SqlFactoryをインポートしていると推測されます。*

ToDoDAOインターフェイスでは、注釈には定数パラメータが必要なため、すべての文字列は静的なものになります。

+0

なぜですか?SqlFactoryの変数はすべてstatic finalです。 –

+0

インタフェースToDoDAOの変数は、 – blackwizard

+0

でなければなりませんが、なぜ静的なSqlFactory。*をインポートできないのですか? –

関連する問題