2009-08-11 78 views
18

Cách được khuyến nghị để cắt ngắn bảng bằng hibernate/hql là gì?Sử dụng hibernate/hql để cắt bớt một bảng?

Tôi đã thử điều này:

 
Query query = session.createQuery("truncate table MyTable"); 
query.executeUpdate(); 

Nhưng nó đã không làm việc (truncate dường như không làm được ghi lại bất cứ nơi nào trong HQL ...)

+2

Cắt ngắn không phải là lệnh DML hoặc DDL tiêu chuẩn, do đó là bình thường không được hỗ trợ. –

Trả lời

11

Tôi đoán một cách khủng khiếp làm nó sẽ xóa tất cả.

public int hqlTruncate(String myTable){ 
    String hql = String.format("delete from %s",myTable); 
    Query query = session.createQuery(hql); 
    return query.executeUpdate(); 
} 
+0

Tôi đã kết thúc bằng cách sử dụng này vì tôi thường chỉ có hai mươi hồ sơ để xóa tại một thời điểm ... Cảm ơn! – user149100

+14

truncat! = Xóa –

+2

@stunaz Chắc chắn truncat! = Xóa nhưng giải pháp ở đây là một sự thỏa hiệp – Stephan

33

Bạn có thể sử dụng thay vì session.createSQLQuery():

session.createSQLQuery("truncate table MyTable").executeUpdate(); 

Không cần phải nói, đây không phải là lý tưởng về tính di động. Nó có thể là một ý tưởng tốt để xác định truy vấn này trong ánh xạ và lấy nó trong mã như truy vấn được đặt tên.

+2

Lưu ý 'createNativeQuery' được ưu tiên sau phiên bản 5.2 – aristotll

5

Tôi đã sử dụng cú pháp xóa trong HQL để duy trì tính di động. Công trình tuyệt vời:

public abstract class GenericDAOImpl<T, ID extends Serializable> implements GenericDAO<T, ID> { 

private Class<T> persistentClass; 

// Balance of dao methods snipped... :) 

/** 
* Clears all records from the targetted file. 
* @throws DAOException 
*/ 
public int truncate() throws DAOException { 
    Session s = getSession(); 
    int rowsAffected = 0; 
    try { 
     Class c = getPersistentClass(); 
     String hql = "delete from " + c.getSimpleName(); 
     Query q = s.createQuery(hql); 
     rowsAffected = q.executeUpdate(); 
    } catch (HibernateException e) { 
     throw new DAOException("Unable to truncate the targetted file.", e); 
    } 
    return rowsAffected; 
} 
/** 
* Returns a Class object that matches target Entity. 
* 
* @return Class object from constructor 
*/ 
public Class<T> getPersistentClass() { 
    return persistentClass; 
} 

Hoạt động tuyệt vời và hoàn toàn cắt ngắn bảng được nhắm mục tiêu. Sử dụng thận trọng vì máy chủ db của bạn sẽ thực hiện tuyên bố này với hiệu quả tuyệt vời ... :)

13

cẩn thận, cắt ngắn và xóa là các câu lệnh sql hoàn toàn riêng biệt: - xóa là DML và cắt ngắn là DDL, có nghĩa là xóa được rollbacked và cắt ngắn không thể được khôi phục - xóa phải tìm từng hàng một. cắt ngắn là tức thời - xóa sử dụng undo log và cắt ngắn không

nếu bạn đặt nó tất cả cùng nhau: 1/nếu bạn muốn nó được rollbackable, bạn không muốn sử dụng truncate 2/nếu bạn sử dụng xóa , với kích thước của bảng bạn muốn để trống: - nếu bảng nhỏ, bạn sẽ thấy không có sự khác biệt - nếu bảng có kích thước trung bình, bạn sẽ gặp phải hiệu suất kém - nếu bảng lớn, bạn sẽ hết khoảng trống trong không gian bảng hoàn tác và bạn sẽ không thể để trống bất kỳ thứ gì

vì vậy, hãy cẩn thận với tuyên bố bạn thực sự muốn sử dụng.

làm cách nào để cắt bớt bảng bằng hql, nên cấm chạy DDL (cắt ngắn, tạo bảng, bảng thả, v.v ...) từ và ứng dụng. Bạn nên sử dụng xóa. Nhưng nếu bảng lớn, nó cũng sẽ không hoạt động. Đó là lý do tại sao làm trống một bảng trong một ứng dụng nói chung là một ý tưởng tồi. Nếu bạn muốn làm một số làm sạch, nó thường là tốt hơn để chạy truncate bên trong một kịch bản sql một lần mỗi đêm.

Lưu ý rằng tôi không biết chi tiết cụ thể về đơn đăng ký của bạn và chỉ nói chung

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