Java 当使用多个ID时,在JPQL中执行CRUD操作的正确方法是什么
我想知道,对于涉及获取和删除多个实体对象的操作,什么是首选/正确的方法 下面是一个例子: 以下是在operator中使用的方法:Java 当使用多个ID时,在JPQL中执行CRUD操作的正确方法是什么,java,jpa,orm,persistence,crud,Java,Jpa,Orm,Persistence,Crud,我想知道,对于涉及获取和删除多个实体对象的操作,什么是首选/正确的方法 下面是一个例子: 以下是在operator中使用的方法: @Override public void delete(Iterable<Long> ids) { startTransaction(); Query query = getEntityManager().createNamedQuery(Entity.DELETE_ALL_BY_IDS_NQ); query.setParame
@Override
public void delete(Iterable<Long> ids) {
startTransaction();
Query query = getEntityManager().createNamedQuery(Entity.DELETE_ALL_BY_IDS_NQ);
query.setParameter(Entity.DELETE_ALL_BY_IDS_PARAMS[0], ids);
query.executeUpdate();
endTransaction();
closeTransaction();
}
下面是通过EntityManager#remove
public void delete(Iterable<Long> ids) {
int count = 0;
startTransaction();
for (Long id : ids) {
count++;
Query query = getEntityManager().createNamedQuery(ImeiTacEntity.IMEITAC_READ_BY_ID_NQ);
query.setParameter(ImeiTacEntity.IMEITAC_READ_BY_ID_PARAMS[0], id);
ImeiTacEntity entity = (ImeiTacEntity) query.getSingleResult();
getEntityManager().remove(entity);
if ((count % BATCH_THRESHOLD) == 0) {
endTransaction();
clearTransaction();
startTransaction();
}
}
endTransaction();
closeTransaction();
}
在这种情况下,第一种选择肯定有其优势。最大的一个是,它转换为单个
delete
SQL查询,而在第二个选项中,您在将每个实体传递给em.remove()
之前加载每个实体。第一个操作是JPQL“批量”操作的一个示例,虽然从执行的SQL语句的数量来看更有效,您应注意以下要点:
10.2.9。JPQL批量更新和删除
操作批量更新和删除操作适用于
单个实体类(及其子类,如果有)
删除操作仅适用于指定类和类型的实体
它的子类它不会级联到相关实体。这个
为更新操作指定的新\u值的类型必须兼容
具有指定给它的状态字段批量更新地图
直接到数据库更新操作,绕过乐观锁定
检查。便携式应用程序必须手动更新
版本列(如果需要)和/或手动验证
版本列持久性上下文未与同步
批量更新或删除的结果。在以下情况下应谨慎使用:
执行批量更新或删除操作,因为可能会导致
数据库与活动数据库中的实体之间存在不一致
持久性上下文。通常,批量更新和删除操作
只能在单独的交易中或在
事务的开始(在访问实体之前)
状态可能会受到此类操作的影响)
因此,在决定一种或其他方法时,您需要考虑上述因素
public void delete(Iterable<Long> ids) {
int count = 0;
startTransaction();
for (Long id : ids) {
count++;
Query query = getEntityManager().createNamedQuery(ImeiTacEntity.IMEITAC_READ_BY_ID_NQ);
query.setParameter(ImeiTacEntity.IMEITAC_READ_BY_ID_PARAMS[0], id);
ImeiTacEntity entity = (ImeiTacEntity) query.getSingleResult();
getEntityManager().remove(entity);
if ((count % BATCH_THRESHOLD) == 0) {
endTransaction();
clearTransaction();
startTransaction();
}
}
endTransaction();
closeTransaction();
}
@NamedQuery(
name = "Entity.readById",
query = "SELECT e from Entity e WHERE e.id = :id"
)