Java 将本机sql转换为未映射的对象

Java 将本机sql转换为未映射的对象,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在修改一个现有的应用程序,我决定处理这两件事 我的未映射对象是一个简单的对象,由2个整数属性组成: public class EmployeeScore { private int id; private int score; } 我有一把刀,它有以下功能: public List<EmployeeScore> findEmployeeTotals(int regionId, int periodId) { DataVerify.greaterThan

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

我的未映射对象是一个简单的对象,由2个整数属性组成:

public class EmployeeScore {

  private int id;
  private int score;
}
我有一把刀,它有以下功能:

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;
    }
public List findeemployeetotals(int regionId,int periodId){
DataVerify.greaterThan(regionId,0,“无效区域id:区域id不能为零”);
DataVerify.lessThan(regionId,4,“无效区域id:区域id不能大于3”);
列表结果=(列表)currentSession().createSQLQuery(
“从中选择n.EMP\u ID和(不同的(名称总点))+
“被提名人n加入提名人nom.nom_ID=n.nom_ID”+
“在n.EMP\u ID=e.EMP\u ID上加入员工e”+
“以c公司代码=e公司代码加入c公司”+
“在r.REGION\u ID=c.REGION\u ID上连接区域r”+
“其中nom.PERIOD_ID=:periodId”+
“和nom.STATUS_ID=2”+
“和e.ISACTIVE=1”+
“和名称类别代码!='H'”+
“和r.REGION_ID=:regionId”+
“按n.EMP\U ID分组”)
.setParameter(“regionId”,regionId)
.setParameter(“periodId”,periodId)
.list();
返回结果;
}
我知道这是一个巨大的疑问。我在测试中遇到了问题,我假设是因为我不理解如何正确地应用这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());
    }
@测试
@事务性(隔离=隔离。可序列化)
公共无效测试分数(){
NomPeriod period=NomPeriod HibernatedAO.findById(6);
Region Region=regionHibernateDAO.findById(1);
列表结果=winnerHibernateDAO.findEmployeeTotals(region.getId(),period.getId());
结果: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<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));
  }
List results=query.List();
列表分数=新建LinkedList();
对于(对象[]arr:results)
{
int id=(int)arr[0];
整数总计=(整数)arr[1];
分数。添加(新员工分数(id,总数));
}

first one返回SQL语法异常,我确实包含了完整的包路径。第二个,我不确定,但是不能将
Object[]
强制转换为
int
:\此外,我正在将查询转换为
列表
它是否应该工作?也许我遗漏了一个注解什么的?这是我要说的更多内容,但是如果没有xml,我如何进行查询呢?您不会将整个对象[]强制转换为int。数组中的每个项都是int-您看到我展示的示例了吗?就上面的示例(新…)而言,实际上必须使用常规的Hibernate查询,而不是SQL查询-我的错误。如果所有实体都已映射(员工、公司、地区、提名),则只需使用第一个选项,并将其更改为Hibernate查询。这正是我使用本机sql的原因,我无法使用这些实体,因为出于某些原因,它们是急于获取的,对于我正在添加的操作,它们将在性能上受到重大影响:(您确定有数据并且联接良好吗?如果在数据库中手动运行查询,您会得到结果吗?