2014-04-24 21 views
8

我有我的實體類可通過一個方法。我試圖弄清楚,如何通過JPA JPQL或Criteria API的我可以發出截斷或刪除。我認爲標準api對於使用類更加自然,而截斷操作更快,所以這些都是首選。這是我到目前爲止所做的,但不知道要添加/更改什麼。從給定的實體類截斷/刪除

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

注:_entityClass回報MyEntity.class,我不得不MyEntity這個沒有其他的引用是一個更廣義的實施。

+0

我認爲在JPQL中沒有'truncate'這樣的事情,你可以爲它寫一個本地查詢或者使用JPQL「delete」。 –

回答

12

假設MyEntity指表要刪除您可以進行如下操作:

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

或廣義的辦法:

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


同樣,對於JPQL/SQL查詢:

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

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

或廣義的辦法:

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

有了標準API,你只能使用SELECT,UPDATE,DELETE語句因此TRUNCATE是不可能的。

+0

好奇的可以創建*查詢是從班級工作嗎? – xenoterracide

+0

你是什麼意思「_made to work from class_」?你能否詳細說明這個問題? – wypieprz

+0

我有'MyEntity.class'的引用我沒有字符串'「MyEntity」'實際上我突變了這個,因此'CriteriaDelete '只是一個強制轉換'(CriteriaDelete)',因爲它不喜歡我進一步通過「ENTITY」參數化它 – xenoterracide