2013-08-21 88 views
14

Tôi có List<Long> dynamics. Và tôi muốn có được kết quả tối đa bằng cách sử dụng Collections. Đây là mã của tôi:java.math.BigInteger không thể truyền sang java.lang.Long

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

Đây là tôi 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; 

    } 

Bây giờ tôi nhận được java.math.BigInteger cannot be cast to java.lang.Long. Chuyện gì vậy?

+3

Tôi muốn nói bạn đang cố gắng truyền 'BigInteger' sang' Long'. –

+0

Vì một cá thể lớp 'java.math.BigInteger' ** không phải là một thể hiện của lớp' java.lang.Long'. –

+0

Bạn sẽ cần cung cấp thêm mã nếu bạn muốn được trợ giúp thêm. Có lẽ dòng lỗi được trỏ đến? Và loại getDynamics() nào trả về? –

Trả lời

17

lỗi của bạn có thể trong dòng này:

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

nơi query.list() trả về danh sách BigInteger thay vì danh sách dài. Hãy thử thay đổi nó thành.

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

Tôi sẽ chọn bạn. – Tony

+0

Như @StormeHawke đã nói '... thực sự trở lại một Danh sách mà ít nhất cũng bao gồm một số BigIntegers'. Vì vậy, bạn nên tìm hiểu chính xác, trước khi bạn gặp phải vấn đề tiếp theo thuộc loại này. – mike

+1

Câu trả lời này nằm trên giả định sai về các loại trình bao bọc nội bộ Hibernate! Chỉ ** Aniket Kulkarni ** trả lời * SQLQuery # addScalar * là đúng! – gavenkoa

0

Bạn có chắc chắn động lực là List<Long> chứ không phải List<BigInteger>?

Nếu động lực học là một List<Long> bạn không cần phải làm một diễn viên đến (Long)

2

Tôi đang thiếu bối cảnh, nhưng điều này chỉ làm việc tốt:

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

Tôi nghe nói rằng' COUNT (*) ' statement trả về 'Long'. Phải không? – Tony

2

Cố gắng chuyển đổi BigInteger để lâu như

Long longNumber= bigIntegerNumber.longValue(); 
26

lựa chọn tốt hơn này là sử dụng SQLQuery#addScalar hơn đúc để Long hay BigDecimal.

Đây được sửa đổi truy vấn trả về count cột như Long

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); 

Sau đó

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

liên kết liên quan

+1

Bạn là anh hùng! 1, nhưng thực sự +100! – gavenkoa

0

Imagine d.getId là Long, sau đó bọc như thế này:

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

Bạn cần quảng cáo d một bí danh cho số truy vấn của bạn và sau đó sử dụng phương pháp addScalar() làm phương thức mặc định cho phương thức list() trong đường nối Hibernate là BigInteger đối với các loại SQL số.Dưới đây là ví dụ:

List<Long> sqlResult = session.createSQLQuery("SELECT column AS num FROM table") 
    .addScalar("num", StandardBasicTypes.LONG).list(); 
Các vấn đề liên quan