小编典典

从给定的实体类中截断/删除

java

我有通过方法提供的实体类。我试图弄清楚如何通过JPA JPQL或Criteria
API发出截断或从中删除。我认为条件api对于使用类更自然,而truncate是一种更快的操作,因此首选。到目前为止,这是我整理的内容,但不确定如何添加/更改。

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

注意:_entityClassreturn MyEntity.class,我没有其他参考,MyEntity这是一个更通用的实现。


阅读 221

收藏
2020-11-16

共1个答案

小编典典

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

使用Criteria API,您只能使用SELECT,UPDATE,DELETE语句,因此TRUNCATE是不可能的。

2020-11-16