2011-11-09 23 views
5

JavaのSQLクエリの列挙型内に列挙型を作成したいと思います。たとえば、私はtable.createと言って、CREATE TABLEまたはdatabase.createを返し、CREATE DATABASEを返します。これどうやってするの?列挙型内の列挙型

enum SQL { 
    table("ALTER,CREATE"), 
    database("CREATE"); 
} 
+0

ホイールを再発明する必要はありません。 HibernateまたはmyBatisを使用するだけです。 – DwB

+0

@DwBサードパーティライブラリを使用することは、常に望ましい選択ではありません。時には、彼らはあなたが取り組んでいるプロジェクトのために過剰です。 –

+0

@PavlosGeorgiou私は私の答えに二次的な解決策を追加しました。それはenum内で列挙していないのに、あなたが求めているものに少し近いです。 –

答えて

1

なぜ列挙型内で列挙型にするのですか?この例ではTable.java

public enum Table { 
    CREATE("CREATE TABLE"), 
    ALTER("ALTER TABLE"); 

    private String cmd; 

    Table(String cmd) { 
     this.cmd = cmd; 
    } 

    @Override 
    public String toString() { 
     return cmd; 
    } 
} 

Database.java

public enum Database { 
    CREATE("CREATE DATABASE"); 

    private String cmd; 

    Database(String cmd) { 
     this.cmd = cmd; 
    } 

    @Override 
    public String toString() { 
     return cmd; 
    } 
} 

System.out.println(Table.CREATE);プリントCREATE TABLE。 IMO、読みやすく、理解し少し簡単になり

String query = Table.CREATE + "(Column1 " + DbType.INTEGER + " " + Column.UNIQUE + " " + Column.PRIMARY_KEY + ")"; 

:あなたのようなコードを生成することができますbecuase

これ

もreadabiltyに役立ちます。

あなたが呼び出すことができます
public enum SQL { 
    TABLE("TABLE", SQL.CREATE_FLAG | SQL.ALTER_FLAG), 
    DATABASE("DATABASE", SQL.CREATE_FLAG); 

    public static final int CREATE_FLAG = 1; 
    public static final int ALTER_FLAG = 2; 

    public static final String CREATE_STRING = "CREATE"; 
    public static final String ALTER_STRING = "ALTER"; 

    public static final String INVALID = "INVALID"; 

    private String name; 
    private boolean create; 
    private boolean alter; 

    SQL(String name, int flags) { 
     create = (flags & CREATE_FLAG) != 0; 
     alter = (flags & ALTER_FLAG) != 0; 

     this.name = name; 
    } 

    public String create() { 
     if (create) 
      return CREATE_STRING + " " + name; 
     else 
      return INVALID; 
    } 

    public String alter() { 
     if (alter) 
      return ALTER_STRING + " " + name; 
     else 
      return INVALID; 
    } 
} 

:近いあなたのような何かを行うことができた後、あなたがしているものに取得しようとする

EDIT

System.out.println(SQL.TABLE.create()); // CREATE TABLE 
System.out.println(SQL.TABLE.alter());  // ALTER TABLE 
System.out.println(SQL.DATABASE.alter()); // INVALID 
System.out.println(SQL.DATABASE.create()); // CREATE DATABASE 
9

列挙型を定義します列挙型内:

public static enum SQL { 
    table(Command.ALTER,Command.CREATE), 
    database(Command.CREATE); 
    public static enum Command { 
     CREATE, 
     ALTER 
    } 
    private final Command[] commands; 
    private SQL (Command... commands) { 
     this.commands = commands; 
    } 
    public Command[] getCommands() { 
     return commands; 
    } 
} 

ですが、独自のクラス/ファイルでCommand enumを宣言する方がよいでしょう。私は誰もenumを宣言していないのです前に別のenum ...私はそれがほとんど好きです。

+0

'CREATE TABLE'を返すために' SQL.table.getCommand(Command.CREATE) 'のような呼び出しで特定のCommandにアクセスしようとするとちょっとファンキーになりますか? –

+0

ありがとうございました... –

+0

いつも使ってます!私は3つの入れ子になったenumのケースを持っています。コードの明確さと使い方は素晴らしいです! – marcolopes