繁体   English   中英

从Java中的对象列表中检索字段

[英]Retrieve fields from object list in 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并执行相同的迭代。 现在我希望通过使用我检索的对象以相同的方式实现,但我无法指定它能够获得哪些值。 所以我被困住了。

有很多方法可以实现所需的结果,但最简单的方法是在Emailqueue类中创建参数化构造函数,并将查询更改为

    String sql = "select NEW 
                  Emailqueue(p.id,p.user,p.subject,p.recipient,p.content) from Emailqueue p 
    where " +
                "p.status='Pending'";
    List<Emailqueue> resList =(List<Emailqueue>) 
    em.createQuery(sql).getResultList();

通过这种方式,您通常可以使用foreach循环遍历List。

如果我了解您的正确需求,请尝试循环您的resList。 我建议你不要得到对象类型。


List<Emailqueue> resList = em.createQuery(sql, Emailqueue.class).getResultList();

for (Emailqueue email : resList) {
     String subject = email.getSubject();
     // something do.
}

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

  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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM