2017-03-02 25 views
0

我已经按照我的仓库本地查询方法:春数据JPA,原生查询,返回错误的字段类型

@Query(value="SELECT appSub.ApplicationFormId as appFormId, appSub.profileId as profileId, " 
       + "p.CASId as profileCASId, ps.programId as programId FROM [unicas_config].[dbo].ApplicationFormEarlyDecisionConfig appFormED " 
       + "INNER JOIN [unicas_ux].[dbo].ApplicationSubmission appSub ON appFormED.ApplicationFormId = appSub.applicationFormId " 
       + "INNER JOIN [unicas_ux].[dbo].Profile p ON appSub.profileId = p.id " 
       + "INNER JOIN [unicas_ux].[dbo].ProgramSelected ps ON p.id=ps.ProfileId AND appSub.applicationFormId = ps.instanceId " 
       + "WHERE appFormED.EarlyDecisionVerdictDate >=:fromDate AND appFormED.EarlyDecisionVerdictDate <:toDate " 
       + "AND appSub.EarlyDecisionStatus='Applied Early Decision' " 
       + "AND appSub.ApplicationStatus='Received' " 
       + "AND ps.IsPaid =1 " 
       + "ORDER BY appSub.ApplicationFormId",nativeQuery = true) 
List<Object[]> getAllEarlyDecisionApplicantsWithPaidProgramsOnVerdictDate(@Param("fromDate") Date fromDate, @Param("toDate") Date toDate); 

现在,我要地图返回结果:

long appFormId = (Long)obj[0] 
long profileId = (Long)obj[1] 
long programId = (Long)obj[3] 

当我我正在这样做,我得到java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long作为Hibernate考虑Integer类型的ID代替Long

请告诉我如何以编程方式告诉Hibernate返回正确的类型。

+3

我不认为这与Hibernate有很大关系。 JDBC驱动程序将返回与数据库中列类型对应的Java类型。为什么你不能只使用Java Integer? –

+0

@AlanHay。是的,你赖特。我发现DB中的列类型是Int类型,即使实体ID也是长类型的。这就是为什么我得到Integer而不是很长。 –

回答

1

为了安全起见,我总是投数值类型Number,然后从它那里得到所需类型的值,如JDBC驱动程序可以根据数据库列的类型返回IntegerLongBigDecimal等。 :

((Number) obj[0]).longValue() 

当然,不要忘记检查null如果列可以为空。

+0

感谢您的回答,这对我非常有用 –