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 つの属性に対する特定のコンストラクターはありません)、結果は Report の ArrayList ではなく Object の Vector に変換されます。結果を ArrayList として保持し、 Report の他のすべての属性を null にする方法はありますか?

4

3 に答える 3

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 NEWReport で 3 つのフィールドのみを持つ新しいコンストラクターを使用して作成します。

于 2013-09-18T12:53:45.987 に答える
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

2 つのオプション。ただし、短いオプションが機能するかどうかはわかりません

長いオプション:

最初にレポートをサブクラス化し、必要なフィールドを持つコンストラクターを新しいクラスに追加します

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 に答える