本机sql进入未映射的对象

时间:2012-08-01 21:29:16

标签: java hibernate hibernate-mapping

我正在修改现有的应用程序,我决定使用这两件事。

我的未映射对象是一个简单的对象,由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值,因为它们引用了不同的表或聚合。

感谢。

1 个答案:

答案 0 :(得分:2)

问题是您正在查询两个整数并尝试将它们解释为EmployeeScores。 Hibernate可以做到,但它需要更多的工作。

假设EmployeeScore有一个带两个整数的构造函数,你可以尝试

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

您需要为其提供完整的包路径。

或者,默认情况下,我认为查询将返回List&lt; Object []&gt ;.因此,您可以迭代这些并手动形成员工分数。

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