从Java对象列表中检索字段

时间:2019-05-15 03:38:22

标签: java

我编写了一个小程序来检索电子邮件队列表中的记录,以处理和发送电子邮件。在使用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并进行相同的迭代。现在,我想通过使用检索到的对象来实现相同的方式,但是我无法指定它能够获取的字段值。所以我被困住了。

3 个答案:

答案 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)

这是基于查询获取数据的简单方法。

  1. 如果您使用实体管理器进行查询并使用HQL,则只需返回类数据即可。这是示例:

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();

  1. 如果要获得自定义结果,则可以将实体的当前类修改为另一个类。

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;