2014-04-24 14 views
8

Ho la mia classe di entità disponibile tramite un metodo. Sto cercando di capire come tramite JPA JPQL o Criteria API potrei rilasciare un troncato o eliminare. Penso che l'API dei criteri sia più naturale per lavorare con le classi e il troncamento è un'operazione più veloce, quindi sono preferibili. Questo è quello che ho messo insieme finora, ma non sono sicuro di cosa aggiungere/modificare al riguardo.troncare/eliminare da data la classe di entità

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

nota: _entityClass rendimenti MyEntity.class, non ho altri riferimenti a MyEntity questo è un'implementazione più generalizzata.

+0

Penso che non ci sia qualcosa come 'truncate' in JPQL, puoi scrivere una query nativa per quello o usare JPQL" delete ". –

risposta

12

Supponendo che MyEntity si riferisce alla tabella che si desidera eliminare si può procedere nel seguente modo:

// 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(); 

o con un approccio generalizzato:

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(); 
} 


Allo stesso modo per JPQL/SQL query:

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

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

o con un approccio generalizzato:

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(); 
} 

Con Criteri API è possibile utilizzare solo SELECT, UPDATE, DELETE quindi TRUNCATE non è possibile.

+0

curioso può creare * Query essere fatto funzionare dalla classe? – xenoterracide

+0

Cosa intendi con "_made to work from the class_"? Potresti per favore elaborare la domanda? – wypieprz

+0

Ho un riferimento a 'MyEntity.class' Non ho la stringa' "MyEntity" 'infatti ho modificato questo in modo che' CriteriaDelete 'sia solo un cast' (CriteriaDelete) 'perché non mi piaceva parametrizzandolo ulteriormente con 'ENTITY' – xenoterracide

Problemi correlati