2013-03-11 5 views
5

मैं एक योग महीनों के आधार पर वर्गीकृत कंप्यूटिंग रहा हूँजेपीए/हाइबरनेट BigDecimal लांग नहीं लौटने

Query q = entityManager.createNativeQuery(qlString); 
q.setParameter("program", program); 
@SuppressWarnings("unchecked") 
List<Long> resultList = (List<Long>) q.getResultList(); 
long tend = System.currentTimeMillis(); 

जब मैं दो resultsLists में पारित एक में (बंद: बंद वस्तुओं के ResultsList, closedLate मदों की ResultsList देर से बंद) विधि जो प्रतिशत की गणना करती है, मुझे

javax.servlet.ServletException: java.lang.ClassCastException: java.math.BigDecimal cannot be cast to java.lang.Long 

मिलता है।

private List<Long> computeOTR(List<Long> closed, List<Long> closedLate) { 
    List<Long> monthlyOTR = new ArrayList<Long>(); 
    long numerator; 
    Long denominator; 
    for (int i = 0; i <11; i++) { 
     numerator = closed.get(i) - closedLate.get(i); <----java.lang.ClassCastException 
     denominator = closed.get(i); 
     long percentage = (int)(numerator * 100.0/denominator + 0.5); 
     monthlyOTR.add(i, percentage); 
    } 
    return monthlyOTR; 

}

ग्रहण डीबग मोड में बंद कर दिया BigDecimal के रूप में दिख रहा है।

public List<Long> findClosedLateByProgram(String program) { 

    long tstart = System.currentTimeMillis(); 
    //@formatter:off 
    String qlString = "with PRJ as (" + 
      "select trunc(END_DATE) as END_DATE, " + 
      "trunc(NEED_DATE) as NEED_DATE " + 
      "from (SELECT UNIQUE * FROM TEST where PROGRAM_NAME = :program " + 
      "AND ACTION_BY_ORG = 'AAA') " + 
      "), " + 
      "DATES as (select add_months(trunc(last_day(SYSDATE)), level-7) as thedate " + 
      "from dual connect by level <= 12 ) " + 
      "SELECT nvl(sum(case when NEED_DATE < trunc(thedate,'mm') AND END_DATE between trunc(thedate,'mm') and thedate then 1 end), 0) as CLOSED_LATE " + 
      "FROM DATES, PRJ " + 
      "GROUP BY thedate ORDER BY thedate"; 
    //@formatter:on 

    Query q = entityManager.createNativeQuery(qlString); 
    q.setParameter("program", program); 
    // q.setParameter("today",date, TemporalType.DATE); 

    @SuppressWarnings("unchecked") 
    List<Long> resultList = q.getResultList(); 
    long tend = System.currentTimeMillis(); 
    long elapsed = tend-tstart; 
    System.out.println("Elapsed Time For Closed But Late: " + elapsed); 
    return resultList; 
} 

संपादित 2

मुझे लगता है कि मैं एक BigDecimal के साथ फंस कर रहा हूँ: क्यों यह जब मैं

List<Long> resultList = (List<Long>) q.getResultList();

संपादित-हाइबरनेट क्वेरी decalre है? http://weblogs.java.net/blog/mb124283/archive/2007/04/java_persistenc.html

+0

भी देखें http://stackoverflow.com/questions/3574029/what-does-jpa-entitymanager-getsingleresult-return-for -ए-गिनती-क्वेरी – Vadzim

उत्तर

4

आपको पहले से ही एक चेतावनी मिलनी चाहिए कि यह दिखा रहा है कि आपकी कास्ट वास्तव में चीजों की जांच नहीं कर रही है। Type erasure का अर्थ है कि निष्पादन समय पर, List<Long> और List<BigDecimal> के बीच कोई अंतर नहीं है। तो कलाकार सफल होता है, और यह केवल बाद में अंतर्निहितLong में विफल रहता है जो विफल रहता है।

असल में आपको यह सुनिश्चित करने के लिए अपनी क्वेरी बदलने की जरूरत है कि यह Long मानों को इसके बजाय बनाता है।

+0

मैं देखता हूं। मेरी क्वेरी परिणाम सूची [33,23,25,29,15,30, न्यूल, न्यूल, न्यूल, न्यूल, नूल, नल] है, मुझे लगता है कि न्यूल इसे बिगडिसीमल पर स्विच कर रहा है। – jeff

+0

@jeff: नहीं, यह आपकी क्वेरी पर निर्भर करेगा। ऐसा लगता है जैसे यह सोचता है कि यह पूर्णांक डेटा प्राप्त कर रहा है। –

+0

इसके बारे में आपका अधिकार। मैंने अपनी क्वेरी को NULL के बजाय 0 को फिर से चालू करने के लिए ठीक किया है और सूची अभी भी बिगडिसीमल है। क्वेरी सिर्फ रिकॉर्ड्स की गणना कर रही है, इसलिए हाँ, बस पूर्णांक डेटा। अगर मैं अपने जेपीए क्वेरी से सभी जेनरिक को हटा देता हूं और फिर डीबग मोड इनपसेक्ट परिणाम सूची में, यह मेरे 12 पूर्णांक मान के लिए बिगडेसिमल दिखाता है। मुझे समझ में नहीं आता कि क्वेरी – jeff

0

आप परिणामों पर पुनरावृति और स्ट्रिंग से वस्तुओं को परिवर्तित करना चाहिए:

Query query = createSQLQuery(sql); 
    List<Long> ids = new java.util.ArrayList<Long>(); 
    java.util.Iterator res = query.list().iterator(); 

    try { 
     while(res.hasNext()){ 
      ids.add(new Long(res.next().toString())); 
     } 
    } catch(Exception ex) { 
     ex.printStackTrace(); 
    } 
+0

बिगडेसिलल # लांगवैल्यू() – MirandaVeracruzDeLaHoyaCardina

संबंधित मुद्दे