2010-08-17 30 views
11

Khi chạy ngược lại và cơ sở dữ liệu Oracle, kiểu thời gian chạy của đối tượng mà mã Spring Hibernate Template (Spring 2.5 và Hibernate 3.3.2GA) sau đây trả về nơi truy vấn SQL là truy vấn đếm như select count(*) from table?Kiểu đối tượng nào Spring Nibernate Template thực thi phương thức trả về cho một truy vấn đếm trên Oracle?

String sql = "select count(*) from table"; 
BigDecimal count = (BigDecimal) hibernateTemplate.execute(
    new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException { 
    SQLQuery query = session.createSQLQuery(sql); 
    return (BigDecimal) query.uniqueResult(); 
    }}); 
return count; 

Mã này ném ngoại lệ sau đây:

javax.ejb.EJBException: EJB Exception: : java.lang.ClassCastException: java.math.BigDecimal cannot be cast to [Ljava.lang.Object; 
    at org.hibernate.cache.StandardQueryCache.put(StandardQueryCache.java:83) 
    at org.hibernate.loader.Loader.putResultInQueryCache(Loader.java:2185) 
    at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2129) 
    at org.hibernate.loader.Loader.list(Loader.java:2087) 
    at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289) 
    at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695) 
    at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) 
    at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:150) 
    at org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:804) 
    at com.db.abstrack.dao.hibernate.RfqCdoUsDaoHibernate$1.doInHibernate(RfqCdoUsDaoHibernate.java:124) 
+1

Erm, chạy mã? Nếu không có ClassCastException, đó là một BigDecimal, nếu không ngoại lệ sẽ cho bạn biết đó là loại gì. (HibernateTemplate.execute trả về đối tượng được trả về bởi HibernateCallback được cung cấp, mà bạn đưa vào BigDecimal). – meriton

+0

Bạn đang sử dụng phiên bản thư viện ngủ đông nào? Nó được sử dụng để trả về một Integer, nhưng bây giờ nó phải là một Long. –

+0

Đã cập nhật câu hỏi để hiển thị Hibernate 3.3.2GA. –

Trả lời

9

Hóa ra rằng ClassCastException có thể là do một lỗi trong Bộ nhớ cache truy vấn chuẩn Hibernate.

Giải pháp là thêm một vô hướng với truy vấn:

String sql = "select count(*) as result from table"; 
BigDecimal count = (BigDecimal) ht.execute(new HibernateCallback() { 
    public Object doInHibernate(Session session) 
      throws HibernateException { 
     SQLQuery query = session.createSQLQuery(sql); 
     // Add scalar to avoid bug in Hibernate query cache. 
     query.addScalar("result", Hibernate.BIG_DECIMAL); 
     return query.uniqueResult(); 
    } 
}); 

Tài liệu tham khảo:

+0

Thú vị. Cảm ơn bạn đã đăng bài này (và +1 tất cả xung quanh). –

+0

Cảm ơn con trỏ của bạn. Thật không may tôi không thể sử dụng giải pháp của bạn, bởi vì truy vấn tiêu chí của tôi trả về một thực thể (chứ không phải chỉ là một vô hướng) bằng cách sử dụng một 'ResultTransformer'. Theo mô tả lỗi _HHH-5163_ lỗi này nên được sửa khi Hibernate 4.0.0 được phát hành –

0

Tôi nghĩ rằng nó sẽ trả về gõ Long. Tôi đã sử dụng Long trong mã của mình. Nhưng nếu BigDecimal của bạn hoạt động sau đó thậm chí tôi muốn biết là những gì mà kiểu trả về :)

15

Làm thế nào về

long value = ((Number)query.uniqueResult()).longValue(); 
return Long.valueOf(value); 

này sẽ làm việc cho tất cả các lớp con của Number như Long, đôi, BigInteger hoặc BigDecimal.

+0

Đây là cách chính xác để giải quyết vấn đề này. – Paul

0

Loại lớp của đối tượng mà hibernateTemplate.execute() trả về thực sự là BigDecimal. Nó chỉ ra rằng nguyên nhân của ClassCastException là diễn viên của các giá trị trả về của phương pháp doInHibernate():

(BigDecimal) query.uniqueResult(); 

đang Corrected:

BigDecimal count = (BigDecimal) hibernateTemplate.execute(
    new HibernateCallback() { 
    public Object doInHibernate(Session session) throws HibernateException { 
    SQLQuery query = session.createSQLQuery(sql); 
    return query.uniqueResult(); 
    }}); 
return count; 
+0

Điều này không giải quyết được vấn đề. Rõ ràng, có thể có một lỗi trong bộ nhớ cache truy vấn Hibernate. –

Các vấn đề liên quan