Thật dễ dàng để sử dụng @AdditionalCriteria trong EclipseLink ví dụ để lọc ra các thực thể bị xóa mềm nhưng có cách nào vô hiệu hóa nó tạm thời trước khi thực hiện một truy vấn cụ thể không?Có cách nào để vô hiệu hóa @AdditionalCriteria trong EclipseLink không?
Trả lời
Có, có thể, với cách giải quyết dễ dàng. Tôi đã chỉ định các chú thích @AdditionalCriteria như thế này:
@AdditionalCriteria(":disableDeletedFeature = 1 or this.isDeleted = false")
và chỉ định một giá trị tài sản mặc định cho lá cờ vô hiệu hóa trong persistence.xml:
<property name="disableDeletedFeature" value="0"/>
nên bằng cách lọc mặc định được kích hoạt nhưng bạn có thể vô hiệu hóa nó dễ dàng ở cấp EntityManager như sau:
entityManager.setProperty("disableDeletedFeature", 1);
Nó hoạt động tốt cho tôi, hy vọng điều đó sẽ hữu ích!
Nếu bạn sử dụng truy vấn SQL gốc, tiêu chí sẽ không được nối thêm.
Nếu không, không có cách dễ dàng để tắt tính năng này, trừ khi bạn tạo một đơn vị lưu giữ khác hoặc một lớp khác không có tiêu chí bổ sung.
Một điều bạn có thể làm là đặt điều kiện OR trong tiêu chí dựa trên thuộc tính phiên, sau đó khi bạn đặt thuộc tính này thành true, bạn có thể vô hiệu hóa tiêu chí.
Bạn có thể đăng nhập yêu cầu nâng cao để có tùy chọn được thêm vào để không thêm nó vào truy vấn.
Tôi sử dụng eclipselink 2.4.1. Nó chỉ làm việc với BÁO GIÁ MARK ứng với giá trị tài sản:
@AdditionalCriteria(":disableDeletedFeature = '1' or this.isDeleted = false")
và ở đây:
entityManager.setProperty("disableDeletedFeature", '1');
Tôi xem nó như là một cách giải quyết chứ không phải là một giải pháp khuyến khích nhưng kể từ khi tôi đã thực hiện nó rất tương tự (sử dụng @AdditionalCriteria ("this.deleted =: SOFTDELETED")), tôi chấp nhận câu trả lời này. @ James, có một số nói về việc thực hiện hỗ trợ cấp bản địa cho nó trên wiki phát triển Eclipselink (http://wiki.eclipse.org/Talk:EclipseLink/Development/AdditionalCriteria). – Kalle
Cảm ơn Kristof và Kalle. Cả hai giải pháp đều làm việc cho tôi trên PostgreSQL, nhưng: disableDeletedFeature = 1 không hoạt động cho các thử nghiệm đơn vị của chúng tôi với H2. Vì vậy, tôi đã sử dụng @AdditionalCriteria ("this.blocked =: disableDeletedFeature OR this.blocked = false") –