2012-01-12 16 views
5

Tôi đang làm việc để chuyển đổi nhà cung cấp JPA kiên trì của mình từ EclipseLink 2.3 sang Hibernate 3.6.5.Final. Vấn đề là với truy vấn gốc. Lưu ý: đây không phải là vấn đề với EclipseLink. Tôi đang cố gắng để có được một giá trị vô hướng, một String từ một bảng mà tôi không có một thực thể tuyên bố cho. Đây là mã:getSingleResult trả về proxy trên truy vấn vô hướng nguyên bản trong hibernate

Query q = em.createNativeQuery("select description from foo where foo_id = ?"); 
q.setParameter(1, fooId); 
String description = (String)q.getSingleResult(); 

Với Hibernate tôi nhận được ClassCastException vì đối tượng trả về thực sự là đối tượng proxy. Tôi không biết nó là loại gì, nhưng tôi biết nó không phải là một mảng (object.getClass().isArray() là sai) và tôi biết nó không phải là một Danh sách (object instanceof Listfalse).

Tôi đang thiếu gì?

+0

Giao diện nào thực hiện 'q.getSingleResult(). GetClass(). GetInterfaces()' return? –

+0

Ahhh ... đó là những gì tôi cần. Nó thuộc loại java.sql.Clob, org.hibernate.engine.jdbc.WrappedClob và java.io.Serializable. Nếu bạn làm cho câu trả lời đó, tôi sẽ chấp nhận nó. Tôi thậm chí còn không nhận ra cột là một cái đinh và tôi ngạc nhiên khi EclipseLink đang thực hiện chuyển đổi thành String cho tôi. – Ryan

+0

vui vì tôi có thể giúp! –

Trả lời

4

bình luận Tóm tắt bên dưới câu hỏi:

gì giao diện làm q.getSingleResult().getClass().getInterfaces() trở lại?


Nó là loại java.sql.Clob, org.hibernate.engine.jdbc.WrappedClobjava.io.Serializable. [...] Tôi thậm chí còn không nhận ra cột là một clob và tôi ngạc nhiên EclipseLink đang làm chuyển đổi sang String cho tôi


Hình như EclipseLink là đủ thông minh để chuyển đổi CLOB (mà thực sự là một chuỗi ký tự rất dài, giống như String) đến String nếu được yêu cầu. Với Hibernate, điều này phải được thực hiện một cách rõ ràng. Tôi đoán điều này tuân thủ đặc điểm kỹ thuật của JPA.

0

Bạn đã định cấu hình phương ngữ cơ sở dữ liệu đúng cho ngủ đông chưa? Phương ngữ được sử dụng để ánh xạ loại giá trị vô hướng.

+0

Tôi đang sử dụng cơ sở dữ liệu Oracle và tôi đã cấu hình nó trong một DataSource trong máy chủ ứng dụng của mình. Khi Hibernate khởi tạo nó báo cáo trong các bản ghi - Sử dụng phương ngữ: org.hibernate.dialect.Oracle10gDialect vì vậy tôi đoán nó đã tìm ra. – Ryan

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