2011-11-09 4 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 제 3 자 라이브러리를 사용하는 것이 항상 바람직한 선택은 아닙니다. 때로는 그들이 작업하고있는 프로젝트에 과도 함이 있습니다. –

+0

@ PavlosGeorgiou 제 답변에 대한 제 2의 해결책을 추가했습니다. 열거 형 안에 열거되지는 않지만 묻고있는 것에 더 가깝습니다. –

답변

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; 
    } 
} 

:

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

을 열거 정의

편집하는 것은

것은 당신이 뭔가를 할 수 계신에 가까이하려고합니다 enum 내 :

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; 
    } 
} 

수 있습니다 이렇게, 고유 한 클래스/파일에서 명령 열거 형을 선언하는 것이 좋습니다. 나는 누군가 enum을 선언하는 것을 보지 못했다 다른 enum 전에 ... 나는 거의 그것을 좋아한다.

+0

'CREATE TABLE'을 반환하기 위해'SQL.table.getCommand (Command.CREATE)'와 같은 호출을 사용하여 특정 Command에 접근하려고 조금 펑키 해 보시겠습니까? –

+0

대단히 고마워 ... –

+0

항상 사용하고 있습니다! 3 개의 중첩 enum 경우가 있습니다. 코드 선명도와 사용은 놀랍습니다! – marcolopes