2014-04-24 14 views
8

Moja klasa jednostek jest dostępna za pośrednictwem metody. Próbuję dowiedzieć się, jak za pośrednictwem JPA JPQL lub API Criteria mogę wydać skrócone lub usunąć z. Uważam, że kryteria api są bardziej naturalne w pracy z klasami, a skracanie jest szybszą operacją, więc są one preferowane. To jest to, co do tej pory przygotowałem, ale nie wiem, co dodać/zmienić.skróć/usuń z podanej klasy obiektu

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

uwaga: _entityClass powraca MyEntity.class mam żadnych innych odniesień do MyEntity tym jest bardziej uogólniony realizacja.

+0

Myślę, że nie ma czegoś takiego jak "skracanie" w JPQL, można napisać natywne zapytanie lub użyć JPQL "delete". –

Odpowiedz

12

Zakładając, że MyEntity odnosi się do stołu chcesz usunąć można postępować w następujący sposób:

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

lub uogólnionego podejścia:

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


Podobnie dla JPQL/SQL zapytania:

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

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

lub uogólnionego podejścia:

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

kryteria API można użyć tylko SELECT, UPDATE, DELETE TRUNCATE zatem nie jest możliwe.

+0

ciekawy czy można stworzyć * zapytanie do pracy z klasy? – xenoterracide

+0

Co masz na myśli przez "_made do pracy z klasy"? Czy mógłbyś rozwinąć to pytanie? – wypieprz

+0

Mam odwołanie do 'MyEntity.class' Nie mam ciąg' "MyEntity" 'w rzeczywistości zmutowałem to tak, że' CriteriaDelete 'jest po prostu rzut' (CriteriaDelete) ', ponieważ nie lubię mnie dalej paramatyzować go za pomocą 'ENTITY' – xenoterracide

Powiązane problemy