Java 当使用多个ID时,在JPQL中执行CRUD操作的正确方法是什么

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

我想知道,对于涉及获取和删除多个实体对象的操作,什么是首选/正确的方法

下面是一个例子:

以下是在operator中使用的方法:

@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"
)