java—为什么名称派生的jpa查询方法如此有效?

hfsqlsce  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(624)

我有一个存储库接口和名称派生的查询方法:

int deleteAllBySpaceIdAndUserId(UUID spaceId, UUID userId);

调用此方法会导致先选择查询,然后删除查询。
发行select有什么意义?为什么不作为单个查询进行计算?为什么我需要它以这种(奇怪的)方式工作?

dpiehjr4

dpiehjr41#

spring数据不执行直接sql查询来删除实体,而是使用entitymanager及其remove方法。
例如,您可以查看org.springframework.data.jpa.repository.support.simplejparepository类,它为默认方法(例如deletebyid等)提供了实现:

public void delete(T entity) {

    Assert.notNull(entity, "Entity must not be null!");

    if (entityInformation.isNew(entity)) {
        return;
    }

    Class<?> type = ProxyUtils.getUserClass(entity);

    T existing = (T) em.find(type, entityInformation.getId(entity));

    // if the entity to be deleted doesn't exist, delete is a NOOP
    if (existing == null) {
        return;
    }

    em.remove(em.contains(entity) ? entity : em.merge(entity));
}

由于entitymanager的remove方法获取实体对象本身,而不仅仅是id值或类似的值,因此spring data必须使用所选的参数(id或在您的案例中是2个值)执行find方法,以获取实际的实体对象,然后将其从entitymanager中移除。

相关问题