2017-03-02 50 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

感謝您的回答,這對我非常有用 –