2012-08-14 72 views
6

Trong chế độ ngủ đông (3.2.1.GA), tôi sử dụng phương pháp sau để chèn dữ liệu kiểu CLOB vào cơ sở dữ liệu Oracle (10g).Làm thế nào để chuyển đổi một kiểu dữ liệu CLOB thành một String trong Hibernate?

Hibernate.createClob(parameters.get("txtCatImage")); 

parametersMap nơi tất cả thông số yêu cầu đã được lưu trữ. Trong khi truy xuất loại dữ liệu Clob từ cơ sở dữ liệu trực tiếp, chẳng hạn như entityObj.getCatImage() sẽ không hoạt động.

Đã xem thisthis câu hỏi nhưng không thể tìm được đường.

Sau đây là pháp nhân sử dụng thuộc tính loại Clob.

public class Category implements java.io.Serializable { 

    private Long catId; // Primary key. 
    private Clob catImage; // CLOB type field. 
    // Other fields. 
    private static final long serialVersionUID = 1L; 

    public Category() {} 

    // Overloaded constructs + getters + setters + hashcode() + equals() + toString(). 
} 

Các Clob lĩnh vực trong cơ sở dữ liệu chỉ lưu giữ một tên tập tin hình ảnh, trong trường hợp này.

+0

Xác định 'sẽ không hoạt động'. Bạn đang nhận được một lỗi hoặc là nó trở về 'null'? – Dev

+0

@Dev - Nó không đưa ra bất kỳ lỗi nào. Nó chỉ hiển thị một đối tượng tham chiếu một cái gì đó như thế này 'org.hibernate.lob.SerializableClob @ 1e2ad75' với một trong hai' obj.getCatImage(). ToString() 'hoặc' obj.getCatImage() 'thay vì hiển thị nội dung thực tế. tên tệp hình ảnh trong cơ sở dữ liệu Oracle. SQL thực tế trên dấu nhắc Oracle như 'SELECT * FROM category' tuy nhiên hiển thị trực tiếp nội dung actaul trên thiết bị đầu cuối Oracle. – Tiny

Trả lời

9

Hoặc gọi Clob.getSubString(long, int) với đối số thích hợp để có được những mong muốn String hoặc đọc các CLOB như một InputStream hoặc Reader sử dụng Clob.getAsciiStream() hoặc Clob.getCharacterStream().

Nếu CLOB có ít hơn 2147483647 (aka Integer.MAX_VALUE) ký tự mà bạn có thể làm điều này

Clob clob = ... //Your clob 
String clobString = clob.getSubString(0, clob.length()); 
+6

'getSubString()': Ký tự đầu tiên ở vị trí 1, không 0, lạ, nhưng đây là những gì JavaDoc nói – dzieciou

+1

có thể là ở phiên bản đầu, vị trí bắt đầu từ 0. Ngoài ra, cả hai tham số phải là int (clob). length() trả về lâu vì vậy bạn cũng cần chuyển đổi nó). –

0

này có thể làm việc

new BufferedReader(new InputStreamReader(catImage.getAsciiStream())).readLine() 
2

Các giải pháp từ Dev (xem ở trên) để sử dụng "CLOB. getSubString (dài, int) "sẽ tốn rất nhiều bộ nhớ. Tôi thích giải pháp sau đây.

private static String getAsString(Clob clob) { 
    Reader reader = null; 
    BufferedReader bufferedReader = null; 
    try { 
     reader = clob.getCharacterStream(); 
     bufferedReader = new BufferedReader(reader); 
     return IOUtils.toString(bufferedReader); 

    } catch (Exception e) { 
     throw new RuntimeException("Error while reading String from CLOB", e); 
    } finally { 
     IOUtils.closeQuietly(reader); 
     IOUtils.closeQuietly(bufferedReader); 
    } 
} 
Các vấn đề liên quan