2

我正在尝试做类似的事情:

List<Report> results = new ArrayList<Report>();
results = em.createQuery("SELECT u.firstname, u.lastname, u.workEmail FROM Employee u", Report.class)
                        .getResultList();

但是,Report 具有比从数据库中选择的 3 列更多的属性(并且没有针对这 3 个属性的特定构造函数),因此结果被转换为 Object 的 Vector 而不是 Report 的 ArrayList。有没有办法将结果保留为 ArrayList 并使 Report 的所有其他属性为 null ?

4

3 回答 3

0

两种选择,虽然我不确定短的是否可行

长选项:

第一个子类报告,向新类添加一个构造函数,其中包含您想要的字段

public class MyReport extends Report {
   public MyReport(String firstname, String lastname, String workEmail) {
   ...
   }
}

并使用SELECT NEW构造

SELECT new MyReport(u.firstname, u.lastname, u.workEmail) FROM Employee u

短选项:

完全一样,只是不用创建子类,只需在Report. 我不记得有什么禁止这样做的,但无论如何我会仔细测试它。

于 2013-09-18T11:44:14.573 回答
0
 List data =em.createQuery("SELECT u.firstname, u.lastname, u.workEmail FROM Employee u", Report.class)
                    .getResultList();
 List<Report> results = new ArrayList<Report>();

 for (Object object : data) {
    Map row = (Map) object;
    Report report = new Report();
    report.setFirstName(row.get("0"));
    report.setLastName(row.get("1"));
    report.setWorkEmail (row.get("2"));
    results.add(report); 
 }
于 2013-09-18T11:56:03.073 回答
0

直接回答问题:没有。当然,如果您尝试如上所述执行查询,您将收到 RuntimeException。唯一的解决方案是:

解决方案 1正如@Prabhakaran 所写并且您注意到的那样,使用选定的字符串来创建一个新的报告,如下所示:

List data =em.createQuery("SELECT u.firstname, u.lastname, u.workEmail FROM Employee u", Report.class).getResultList();
List<Report> results = new ArrayList<Report>();
for (Object object : data) {
   Map row = (Map) object;
   Report report = new Report();
   String firstName = row.get("0");
   String lastName = row.get("1");
   String lastEmail = row.get("2");
   results.add(new Report(firstName, null,..., lastName, ..., lastEmail)); 
}

解决方案 2 正如@SJuan76 所说:SELECT NEW在 Report 中使用并创建一个只有三个字段的新构造函数。

于 2013-09-18T12:53:45.987 回答