2012-05-31 161 views
0

對象類型,這裏是我的功能:聲明通過字符串

private boolean CheckPassword(String type, String login, String passwordHash) { 
    EntityManagerFactory entityManagerFactory 
      = Persistence.createEntityManagerFactory("kwestionariuszFor" + type); 
    EntityManager entityManager 
      = entityManagerFactory.createEntityManager(); 
    type = type.substring(0, 1).toUpperCase() + type.substring(1, type.length()); 
    List<Object> entities 
      = entityManager.createNamedQuery(type + ".findByLogin").setParameter("login", login).getResultList(); 
    if (passwordHash.equals(entities.get(0).Password)) { 
     return true; 
    } 
    else { 
     return false; 
    } 
} 

的Java不「知道」有任何表的Password列。我正在想,告訴它的方式可能如下所示:

List<type.toClass()> 

什麼東西......有什麼辦法可以實現我想要的嗎?我不想創建,如果之後,如果......之後...... -_-'

+0

看起來你正在試圖施放。你怎麼知道你收到的類型是否有密碼字段? – Emily

+1

「Stringly typed code」=( –

+0

@Emily,因爲這個函數只能從四個其他函數中調用,只能在有密碼字段的對象上強制轉換:) – smsware

回答

2

您必須爲代表數據庫表的所有類創建一個通用類型。

像這樣:

public abstract class PasswordObject { 
    private String password; 

    public PasswordObject(String password) { 
     this.password = password; 
    } 

    public String getPassword() { 
     return password; 
    } 
} 

我不知道,如果該方法createNamedQuery將能夠返回List<PassowrdObject>,但如果沒有,你可以只投它像這樣(只要它是安全的做所以,你只能通過你使用它的方式告訴你):

PasswordObject po = (PasswordObject) entities.get(0); 
String password = po.getPassword(); 
+0

嗯,我認爲這將工作,但我得到了「不能投」的錯誤,所以我得到和想法重新創建mysql查詢......並非所有事情都必須用Java來完成,對吧? ;-) – smsware

+0

我不知道你正在使用哪種框架,但是必須有一種方法來獲得列表,其中A是你想要的類型!你可能會得到一個列表,因爲你濫用框架,這不是好的做法。在Spring JDBC中,您將擁有一個將數據庫表映射到Java對象的ObjectMapper,因此您可以執行下列操作:列表 result = jdbcTemplate.query(sql,new A_Mapper()); – Renato