2011-11-16 30 views
11

Tôi có một lớp miền, Widget, mà tôi cần phải xóa tất cả các trường hợp ra khỏi - xóa nó ra. Sau đó, tôi sẽ tải dữ liệu mới. Những gì bạn đề nghị như một cơ chế để làm điều này?grails xóa tất cả dữ liệu khỏi bảng/tên miền, tức là "deleteAll"

P.S. Lưu ý đây không phải là lúc khởi động, nhưng tại "thời gian chạy".

+0

Điều này cũng được trả lời trong http://stackoverflow.com/a/ 10278312/329954 – JesperSM

Trả lời

42

Cách đơn giản nhất là sử dụng HQL trực tiếp:

DomainClass.executeUpdate('delete from DomainClass') 
+0

Tuyệt vời, cảm ơn, điều này hoạt động rất nhanh. (không liên quan đến điều này - bất kỳ suy nghĩ về lý do tại sao các bộ lọc không làm việc cho tôi trong các câu hỏi lọc/chia dòng? Nó làm việc cho bạn?) – Ray

+0

Điều này làm việc trong các phiên bản mới nhất của Grails. Trong 2.4.4 chưa. – Gab

+0

@ataylor Điều gì xảy ra nếu lớp miền có liên kết? Thông thường, chúng tôi muốn xóa tất cả chúng, không chỉ các truy vấn HQL DomainClass –

3
DomainClass.findAll().each { it.delete() } 

Nếu bạn muốn tránh bất kỳ gotchas GORM, chẳng hạn như cần phải xóa các đối tượng ngay lập tức và kiểm tra để chắc chắn rằng nó thực sự bị xóa, thêm một số đối số.

DomainClass.findAll().each { it.delete(flush:true, failOnError:true) } 
+4

Lưu ý rằng điều này sẽ tải toàn bộ bộ sưu tập, từ cơ sở dữ liệu, vào bộ nhớ, sau đó xóa từng bộ, riêng lẻ, với truy vấn cơ sở dữ liệu riêng biệt cho từng bộ. Hiệu suất của điều này sẽ là khủng khiếp nếu bạn có nhiều hơn chỉ là một vài đối tượng để xóa, do số lượng roundtrips đến cơ sở dữ liệu. – GreenGiant

-1

Nếu bạn có danh sách đối tượng và muốn xóa tất cả các thành phần, bạn có thể sử dụng toán tử *.

'*' will split the list and pass its elements as separate arguments. 

Ví dụ.

List<Book> books = Book.findAllByTitle('grails') 
books*.delete() 
0

Từ những gì tôi học được, tôi đồng ý với @ataylor mã dưới đây là nhanh nhất nếu không có các hiệp hội trong đối tượng tên miền của bạn (Rất khó xảy ra trong bất kỳ ứng dụng thực tế):

DomainClass.executeUpdate('delete from DomainClass') 

Nhưng nếu bạn có sự hợp tác với các tên miền khác, sau đó cách an toàn nhất để xóa (và cũng chậm hơn một chút so với cách được đề cập ở trên) sẽ như sau:

def domainObjects = DomainClass.findAll() 
domainObjects.each { 
it.delete(flush:it==domainObjects.last, failOnError:true) 
} 
Các vấn đề liên quan