2014-04-24 20 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