2013-08-21 6 views
14

List<Long> dynamics이 있습니다. 그리고 Collections을 사용하여 최대 결과를 얻고 싶습니다.java.math.BigInteger를 java.lang.Long으로 캐스팅 할 수 없습니다.

List<Long> dynamics=spyPathService.getDynamics(); 
     Long max=((Long)Collections.max(dynamics)).longValue(); 

이 내 getDynamics입니다 :

public List<Long> getDynamics() { 

     Session session = null; 

     session = this.sessionFactory.getCurrentSession(); 
     Query query = session 
       .createSQLQuery("SELECT COUNT(*) FROM SpyPath WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) GROUP BY DATE(time) ORDER BY time;"); 

     List<Long> result = query.list(); 
     return result; 

    } 

가 지금은 java.math.BigInteger cannot be cast to java.lang.Long 받고 있어요 이건 내 코드입니다. 뭐가 문제 야?

+3

'BigInteger'를 'Long'으로 캐스팅하려고합니다. –

+0

'java.math.BigInteger' 클래스 인스턴스 **는 java.lang.Long 클래스의 인스턴스가 아니기 때문에 **. –

+0

도움이 더 필요하면 더 많은 코드를 제공해야합니다. 어쩌면 오류가 가리키는 라인일까요? 그리고 getDynamics()는 어떤 타입을 반환합니까? –

답변

17

귀하의 오류가있을 수 있습니다

List<Long> result = query.list(); 

여기에서 query.list()는 Long 목록 대신 BigInteger List를 반환합니다. 그것을으로 변경하십시오.

List<BigInteger> result = query.list(); 
+0

당신을 선택하겠습니다. – Tony

+0

@StormeHawke가 말했듯이 ... 실제로 BigIntegers를 포함하고있는 목록을 반환하고 있습니다. 따라서 여러분은 이런 종류의 다음 문제에 부딪 치기 전에 정확히 알아내는 것이 좋습니다. – mike

+1

이 답변은 내부 Hibernate 래퍼 유형에 대한 잘못된 가정에 있습니다! 유일한 ** Aniket Kulkarni ** 대답 * SQLQuery # addScalar *가 맞습니다! – gavenkoa

0

다이내믹스가 List<Long>이고 List<BigInteger>이 아닌 것은 확실합니까?

역학은 List<Long> 당신은 내가 문맥을 결여하고있어

2

(롱)에 캐스팅을 할 필요가 없습니다, 그러나 이것은 잘 작동하는 경우 :

List<BigInteger> nums = new ArrayList<BigInteger>(); 
Long max = Collections.max(nums).longValue(); // from BigInteger to Long... 
+0

'COUNT (*)' 명령문이'Long'을 리턴합니다. 그렇지 않니? – Tony

2

보십시오이

Long longNumber= bigIntegerNumber.longValue(); 
26

더 나은 옵션처럼 긴에 BigInteger를 변환 Long 또는 BigDecimal에 캐스팅보다 SQLQuery#addScalar를 사용합니다. 여기

count 열 그리고

Query query = session 
      .createSQLQuery("SELECT COUNT(*) as count 
          FROM SpyPath 
          WHERE DATE(time)>=DATE_SUB(CURDATE(),INTERVAL 6 DAY) 
          GROUP BY DATE(time) 
          ORDER BY time;") 
      .addScalar("count", LongType.INSTANCE); 

List<Long> result = query.list(); //No ClassCastException here 

Long 등의 관련 링크를 반환하는 쿼리를 수정

+1

당신은 영웅입니다! +1하지만 정말로 +100! – gavenkoa

0

이 d.getId가 긴 상상해 사용하는 그래서 그 다음, 최대 절전 모드 버전 3.6.x를
here is the deprecated document 이후 사용되지 않습니다 기억 이런 포장 :

BigInteger l = BigInteger.valueOf(d.getId()); 
1

광고를해야합니다. d 쿼리에 대한 별칭을 입력 한 다음 최대 절전 모드의 list() 메서드의 기본값으로 addScalar() 메서드를 숫자 SQL 형식의 경우 BigInteger이되도록 사용합니다.다음은 예입니다.

List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table") 
    .addScalar("num", StandardBasicTypes.LONG).list(); 
관련 문제