我编写了一个小程序来检索电子邮件队列表中的记录,以处理和发送电子邮件。在使用JDBC实现此目的时,如下所示:
MySqlConnect con=new MySqlConnect();
public PreparedStatement preparedStatement = null;
public Connection con1 = con.connect();
//pick up queue and send email
public void email() throws Exception {
try{
while(true) {
String sql = "SELECT id,user,subject,recipient,content FROM emailqueue WHERE status='Pending' ";
PreparedStatement statement = con1.prepareStatement(sql);
ResultSet rs = statement.executeQuery();
while (rs.next()) {
String subject = rs.getString("subject");
String recipient = rs.getString("recipient");
String content = rs.getString("content");
String id = rs.getString("id");
String username = rs.getString("user");
String emailStatus = "DONE";
String errormsg=sendEmail(recipient, subject, content, id,username);
if (!errormsg.equals("")) {
emailStatus = "FAILED";
}
TerminalLogger.printMsg("Status : " + emailStatus);
}
statement.close();
rs.close();
}
}
}catch(Exception e){
e.printStackTrace();
TerminalLogger.printMsg("Exception: "+e.toString());
}
con1.close();
Thread.sleep(2000);
}
上面的方法工作得很好,因为它检索状态为待定的电子邮件记录,并将主题,内容,收件人等传递给sendemail
方法并完成。
我想实现相同的目标,但改用JPA持久性。所以我写了这个方法:
public Object getrecords() {
try {
String sql = "select p.id,p.user,p.subject,p.recipient,p.content from Emailqueue p where " +
"status='Pending'";
List<Object[]> resList =(List<Object[]>) em.createQuery(sql).getResultList();
if (resList == null) {
throw new Exception("Error with selection query.");
}
if (resList.size() > 0) {
return resList;
}
// msg = "Setting <" + name + "> not found.";
return null;
} catch (Exception e) {
msg = CoreUtil.wrapMsg(CoreUtil.FUNC_ERROR,
this.getClass().getName(), "get(" + "Pending" + ")", e.getMessage());
return null;
}
}
检索表中的记录和大小没有问题。我在email()
中调用了此方法。像这样:
Object records = ejbCon.getSettingsFacade().getrecords();
从这里,我不知道如何循环记录以获取每个字段中的每个值。例如,如果有2个待处理的电子邮件记录,则我需要检索其每个内容,主题,收件人等,并传递给sendemail
方法。
此外,检索这些记录已经对我的程序造成了负担,因为与使用JDBC相比,关闭该应用程序花费的时间较长(速度更快,我想效率更高?)。
因此,我还需要通过使用此方法来考虑性能。
我应该更好地阐明这一点,以解释我要实现的目标。 所以我有这种形式的电子邮件队列表:
id user subject content recipient status
1 user1 test example abc@example.com Pending
2 user2 test2 example cde@example.com Pending
因此,在此之前,我在JDBC中使用结果集来获取id:1的每个单独的字段值,并将它们传递给send方法,然后继续进行id:2并进行相同的迭代。现在,我想通过使用检索到的对象来实现相同的方式,但是我无法指定它能够获取的字段值。所以我被困住了。
答案 0 :(得分:0)
有很多方法可以达到期望的结果,但是最简单的方法是在Emailqueue类中创建参数化的构造函数,并将查询更改为
git remote set-url origin https://<user-name>:<password>@github.com/DevanshiParekh/new-git-project.git
这样,您通常可以使用foreach循环遍历List。
答案 1 :(得分:0)
如果我了解您的正确需求,请尝试循环您的resList。 而且我建议您不要获取对象类型。
List<Emailqueue> resList = em.createQuery(sql, Emailqueue.class).getResultList();
for (Emailqueue email : resList) {
String subject = email.getSubject();
// something do.
}
答案 2 :(得分:0)
这是基于查询获取数据的简单方法。
TypedQuery q = man.createQuery("SELECT u FROM YourTable u WHERE u.col1 =:col1 and u.col2 =:col2", YourCalss.class)
.setParameter("col1", col1)
.setParameter("col2", col2);
result = q.getResultList();
List<CustomClass> result = null;
EntityManager man = PersistenceUtilities.getEntityManagerFactory().createEntityManager();
try {
TypedQuery q = man.createQuery("SELECT NEW " + CustomClass.class.getCanonicalName() + "(u.col1,u.col2) "
+ "FROM YourTable as u ", CustomClass.class);
if (q.getResultList().size() > 0) {
result = q.getResultList();
}
} catch (Throwable t) {
Main.logger.error(t.getMessage());
} finally {
man.close();
}
return result;