2012-05-31 171 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