2009-09-01 28 views
28

định nghĩa lĩnh vựcKhông thể chuyển đổi '0000-00-00 00:00:00' để dấu thời gian

/** Date. */ 
    @Column(columnDefinition = "datetime") 
    private Date date; 

setter

public void setDate(final Date date) { 
    DateFormat dfmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    try { 
     this.date = dfmt.parse(dfmt.format(date)); 
    } catch (ParseException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

Có ai có ý tưởng làm thế nào để chuyển đổi "không hẹn hò" vào đúng giá trị ? Bởi vì tôi có lỗi:

Cannot convert value '0000-00-00 00:00:00' from column 13 to TIMESTAMP 

Và thậm chí nếu tôi đặt trường "mặc định" và setter như thế này:

/** Date. */ 
     @Column 
     private Date date; 


public void setDate(final Date date) { 
     this.date = date; 
    } 

tôi vẫn sẽ có cùng một vấn đề ....

+2

Dường như với tôi rằng 0000-00-00 00:00:00 không tương ứng với bất kỳ thời điểm thực tế nào trong thời gian và do đó về cơ bản không thể chuyển đổi thành giá trị dấu thời gian. Hành vi bạn muốn là gì? Bạn có muốn nó chuyển đổi ngày ISO không hợp lệ thành giá trị mặc định không? –

+0

động thái tiếp theo sau khi tôi lấy dữ liệu (có nhiều hơn một cột trong bảng) từ bảng là viết nó vào XML nhưng (!) Tôi sẽ không viết giá trị Date vào XML vì vậy tôi chỉ muốn lấy dữ liệu từ bảng và sau đó tôi sẽ không bao giờ gọi phương thức getDate(). – Oleksandr

+0

"Bạn có muốn nó chuyển đổi ngày ISO không hợp lệ thành giá trị mặc định không?" - vâng, nếu có thể ... – Oleksandr

Trả lời

63

Tôi sẽ thực hiện một dự đoán hoang dã ở đây rằng bạn đang sử dụng MySQL :-) Nó sử dụng "0 ngày" là special placeholder - không may, JDBC không thể xử lý theo mặc định.

Giải pháp là để xác định "zeroDateTimeBehavior = convertToNull" như tham số để kết nối MySQL của bạn (hoặc trong URL nguồn dữ liệu hoặc như là một tài sản bổ sung), ví dụ:

jdbc:mysql://localhost/myDatabase?zeroDateTimeBehavior=convertToNull 

Điều này sẽ khiến tất cả các giá trị đó được lấy ra như NULL.

+1

+1. Đã có cùng một vấn đề. Tìm thấy cùng một câu trả lời. –

+0

Chỉ cần một lưu ý phụ - điều này sẽ chuyển đổi 0 ngày thành null trong khi đọc nhưng nó sẽ không chuyển đổi null thành 0 trong khi lưu. Tôi đã không tìm thấy một cách để tiết kiệm "0000-00-00" vào một cơ sở dữ liệu thông qua hibernate. – serg

+0

@ serg555 - bạn nói đúng. Tôi phải hỏi, mặc dù - tại sao bạn muốn tiết kiệm "0000-00-00" vào một cơ sở dữ liệu? NULL tồn tại cho chính xác lý do này, toàn bộ "0000-00-00" abomination là gì, nhưng đau đớn. – ChssPly76

3

Tôi không hiểu điểm trong mã của bạn, nơi bạn định dạng rồi phân tích lại một ngày. Điều này có vẻ giống như một hoạt động giống hệt nhau. Có lẽ bạn có thể xây dựng?


Nếu bạn muốn đưa ra một giá trị mặc định cho một ngày, bạn có thể làm:

/** Jan 1, 1970 ; first moment in time in Java */ 
private static final Date NO_DATE = new Date(0L); 

private Date date; 

public void setDate(final Date date) { 
    if (date == null) { 
     this.date = NO_DATE; 
    } else { 
     this.date = date; 
    } 
} 

Lưu ý: chú thích là optionnal, ở đây tôi không thêm chúng.

Trong mã này, bạn có thể thay thế những gì bạn muốn điều kiện và giá trị mặc định.

Bạn cũng có thể thêm bộ đặt tương tự, sẽ lấy đối số Chuỗi và kiểm tra giá trị "00000 ..." đặc biệt của bạn. Điều này sẽ cho phép thiết lập trường hoặc với một ngày, hoặc với một chuỗi.

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