2014-04-24 3 views
8

Ich habe meine Entitätsklasse über eine Methode verfügbar. Ich versuche herauszufinden, wie ich über die JPA JPQL oder Criteria APIs eine trunkate oder delete von ausgeben könnte. Ich denke, dass das Kriterium api für das Arbeiten mit Klassen natürlicher ist, und truncate ist eine schnellere Operation, daher werden diese bevorzugt. Das ist was ich bisher zusammengestellt habe, aber nicht sicher was ich hinzufügen/ändern soll.truncate/delete von gegeben die Entitätsklasse

CriteriaBuilder cb = this._em().getCriteriaBuilder(); 
    cb.createQuery(_entityClass()).from(_entityClass()); 

Anmerkung: _entityClass kehrt MyEntity.class, ich habe keine anderen Verweise auf MyEntity Dies ist eine verallgemeinerte Implementierung.

+0

Ich glaube, es gibt in JPQL keine "truncate", Sie können eine native Abfrage dafür schreiben oder JPQL "delete" verwenden. –

Antwort

12

Unter der Annahme, dass MyEntity bezieht sich auf die Tabelle, die Sie löschen möchten Sie fortfahren können wie folgt:

// Criteria API (JPA 2.1 and above) 
CriteriaBuilder builder = em.getCriteriaBuilder(); 
CriteriaDelete<MyEntity> query = builder.createCriteriaDelete(MyEntity.class); 
query.from(MyEntity.class); 
em.createQuery(query).executeUpdate(); 

oder mit einem generalisierten Ansatz:

public <T> int deleteAllEntities(Class<T> entityType) { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaDelete<T> query = builder.createCriteriaDelete(entityType); 
    query.from(entityType); 
    return em.createQuery(query).executeUpdate(); 
} 


ähnlich für JPQL/SQL Anfragen:

// JPQL 
em.createQuery("DELETE FROM MyEntity e").executeUpdate(); 

// SQL 
em.createNativeQuery("TRUNCATE TABLE MyEntity").executeUpdate(); 

oder mit einem verallgemeinerten Ansatz:

public static <T> int deleteAllEntities(Class<T> entityType) { 
    String query = new StringBuilder("DELETE FROM ") 
          .append(entityType.getSimpleName()) 
          .append(" e") 
          .toString(); 
    return em.createQuery(query).executeUpdate(); 
} 

public static <T> int truncateTable(Class<T> entityType) { 
    String query = new StringBuilder("TRUNCATE TABLE ") 
          .append(entityType.getSimpleName()) 
          .toString();   
    return em.createNativeQuery(query).executeUpdate(); 
} 

Mit Criteria API können Sie nur SELECT, UPDATE, DELETE-Anweisungen daher ist TRUNCATE nicht möglich.

+0

Neugierig kann die create * Query gemacht werden, um von der Klasse zu arbeiten? – xenoterracide

+0

Was meinen Sie mit "_made to work from the class_"? Könnten Sie bitte die Frage ausarbeiten? – wypieprz

+0

Ich habe einen Verweis auf 'MyEntity.class' Ich habe nicht die Zeichenfolge' "MyEntity" 'in der Tat mutierte ich dies, so dass 'CriteriaDelete ' ist nur eine Besetzung '(CriteriaDelete)' weil es mich nicht mochte weiterparametrisieren Sie es mit "ENTITY" – xenoterracide

Verwandte Themen