gpt4 book ai didi

java - 将 native sql 转换为未映射的对象

转载 作者:行者123 更新时间:2023-12-02 07:39:36 26 4
gpt4 key购买 nike

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

我的未映射对象是一个简单的对象,由 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;
}

我知道这是一个巨大的查询。我的测试遇到问题,我认为是因为我不明白如何正确应用这两个。

我的测试如下:

@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 值,因为它们引用不同的表或聚合。

谢谢。

最佳答案

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

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

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

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

或者,默认情况下,我认为查询将返回一个 List 。因此,您可以迭代这些并手动形成员工分数。

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

关于java - 将 native sql 转换为未映射的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11767859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com