我有通过方法提供的实体类。我试图弄清楚如何通过JPA JPQL或Criteria API发出截断或从中删除。我认为条件api对于使用类更自然,而truncate是一种更快的操作,因此首选。到目前为止,这是我整理的内容,但不确定如何添加/更改。
CriteriaBuilder cb = this._em().getCriteriaBuilder(); cb.createQuery( _entityClass() ).from( _entityClass() );
注意:_entityClassreturn MyEntity.class,我没有其他参考,MyEntity这是一个更通用的实现。
_entityClass
MyEntity.class
MyEntity
假设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是不可能的。