0

私は既存のアプリケーションの変更に取り組んでおり、これら2つのことを使用することにしました。

マップされていないオブジェクトは、2つの整数プロパティで構成される単純なオブジェクトです。

public class EmployeeScore {

  private int id;
  private int score;
}

そして私は次のことを行うDAOを持っています:

public List<EmployeeScore> findEmployeeTotals(int regionId, int periodId) {
        DataVerify.greaterThan(regionId, 0, "Invalid Region id: Region Id cannot be zero");
        DataVerify.lessThan(regionId, 4, "Invalid Region id: Region id cannot be greater than 3");
        List<EmployeeScore> results = (List<EmployeeScore>) currentSession().createSQLQuery(
                "select n.EMP_ID, SUM(DISTINCT(nom.TOTAL_POINT)) from" +
                        " NOMINEE n join NOMINATION nom on nom.NOM_ID = n.NOM_ID" +
                        " join EMPLOYEE e on n.EMP_ID = e.EMP_ID" +
                        " join COMPANY c on c.COMPANY_CODE = e.COMPANY_CODE" +
                        " join REGION r on r.REGION_ID = c.REGION_ID" +
                        " where nom.PERIOD_ID = :periodId" +
                        " AND nom.STATUS_ID = 2" +
                        " AND e.ISACTIVE = 1" +
                        " AND nom.CATEGORY_CODE != 'H'" +
                        " AND r.REGION_ID = :regionId" +
                        " group by n.EMP_ID")
                .setParameter("regionId", regionId)
                .setParameter("periodId", periodId)
                .list();

        return results;
    }

それは私が知っている巨大なクエリです。テストで問題が発生しています。これら2つを正しく適用する方法がわからないためだと思います。

私のテストは次のようになります。

@Test
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void testEmpScore() {
        NomPeriod period = nomPeriodHibernateDAO.findById(6);
        Region region = regionHibernateDAO.findById(1);
        List<EmployeeScore> results = winnerHibernateDAO.findEmployeeTotals(region.getId(), period.getId());
        results.toString();
        Assert.assertEquals(13, results.size());
    }

13個のオブジェクトタイプを返す必要EmployeeScoreがありますが、代わりに0を返すため、テストは失敗します。

私が間違っていることの正しい方向に私を向けることができますか?マッピングされていないため、オブジェクトが認識しているものでなければならないことはわかっていますが、スコア値またはID値は異なるテーブルまたは集計を参照しているため、マッピングする方法がありません。

ありがとう。

4

1 に答える 1

2

問題は、2 つの整数をクエリして、それらを EmployeeScores として解釈しようとしていることです。Hibernate で実行できますが、それよりも少し手間がかかります。

EmployeeScore に 2 つの整数を取るコンストラクタがあると仮定すると、試すことができます。

 select new my.package.EmployeeScore(n.EMP_ID, SUM(DISTINCT(nom.TOTAL_POINT))) ...

オブジェクトへの完全なパッケージ パスを指定する必要があります。

または、デフォルトでは、クエリは List<Object[]> を返すと思います。したがって、これらを繰り返し処理して、従業員のスコアを手動で作成できます。

  List<Object[]> results = query.list();
  List<EmployeeScore> scores = new LinkedList<EmployeeScore>();

  for (Object[] arr : results)
  {
     int id = (int) arr[0];
     int total = (int) arr[1];
     scores.add(new EmployeeScore(id, total));
  }
于 2012-08-01T22:07:05.550 に答える