Es ist einfach, @AdditionalCriteria in EclipseLink zu verwenden, um z. B. weiche gelöschte Entitäten herauszufiltern, aber gibt es eine Möglichkeit, sie vor dem Ausführen einer bestimmten Abfrage vorübergehend zu deaktivieren?Gibt es eine Möglichkeit, @AdditionalCriteria in EclipseLink zu deaktivieren?
Antwort
Ja, es ist möglich, mit einer einfachen Problemumgehung. I angegebene @AdditionalCriteria Anmerkung wie folgt aus:
@AdditionalCriteria(":disableDeletedFeature = 1 or this.isDeleted = false")
und eine Standardeigenschaft Wert für das Deaktivieren-Flag im persistence.xml angegeben:
<property name="disableDeletedFeature" value="0"/>
so standardmäßig Filterung aktiviert ist, aber Sie können es deaktivieren leicht an der EntityManager Ebene wie folgt aus:
entityManager.setProperty("disableDeletedFeature", 1);
es funktioniert für mich alles in Ordnung, hoffe, es hilft!
Wenn Sie eine native SQL-Abfrage verwenden, werden die Kriterien nicht angefügt.
Ansonsten gibt es keine einfache Möglichkeit, es wird angehängt zu deaktivieren, sofern Sie keine andere Persistenzeinheit oder eine andere Klasse ohne die zusätzlichen Kriterien erstellen.
Eine Sache, die Sie tun können eine ODER-Bedingung in den Kriterien auf einer Sitzung Eigenschaft basiert gesetzt wird, dann, wenn Sie diese Eigenschaft auf true gesetzt ist, können Sie die Kriterien deaktivieren.
Sie könnten eine Erweiterungsanforderung protokollieren, um eine Option hinzuzufügen, um sie nicht an eine Abfrage anzuhängen.
Ich benutze Eclipselink 2.4.1. Es funktioniert nur mit ANFüHRUNGSZEICHEN für einen Wert der Immobilie:
@AdditionalCriteria(":disableDeletedFeature = '1' or this.isDeleted = false")
und hier:
entityManager.setProperty("disableDeletedFeature", '1');
ich es als Behelfslösung eher als eine empfohlene Lösung sehen, aber da ich es sehr ähnlich umgesetzt hatte (mit @AdditionalCriteria ("this.deleted =: SOFTDELETED")), akzeptiere ich diese Antwort. @James, ja, es gibt ein paar Diskussionen über die Implementierung von Native-Level-Unterstützung für das Eclipselink-Entwicklungs-Wiki (http://wiki.eclipse.org/Talk:EclipseLink/Development/AdditionalCriteria). – Kalle
Danke Kristof und Kalle. Beide Lösungen funktionieren für PostgreSQL, aber: disableDeletedFeature = 1 funktioniert nicht für unsere Komponententests mit H2. Also habe ich @AdditionalCriteria verwendet ("this.blocked =: disableDeletedFeature ODER this.blocked = false") –