QueryDSL 删除方法

9

我正在使用spring-data-mongodb 1.2.0和QueryDSL 2.9.0。

为什么QueryDslPredicateExecutor没有delete(Predicate predicate)方法?

有没有解决办法?

3个回答

4
您可以这样做。使用“where”条件谓词查询对象,然后将其传递给删除方法。
QMyObj obj= new QMyObj("myObj");
Iterable<MyObj> myObjs = myObjRepository.findAll(obj.property.eq("property"));
myObjRepository.delete(myObjs);

首先,我创建了一个 Q 类的实例,然后基于谓词查找所有对象。接下来调用仓库的 void delete(Iterable<? extends T> entities) 方法。

可能是因为这个解决方法,他们没有提供它,但这需要由 Spring Source 的人来确认。


有更好的解决方案 - 请查看此答案https://dev59.com/BWAg5IYBdhLWcg3wU5q8#23731038 - HelpMatters
是否这是更好的解决方案,取决于您的谓词有多复杂。 - Mikkel Løkke

1
我能够通过以下方式实现这个功能:
    @Autowired
    LocalContainerEntityManagerFactoryBean emFactory;
    
    EntityManager em;
    
    @PostConstruct
    private void setup(){
    em = emFactory.getObject().createEntityManager();
    }
    
        @Transactional private voide deleteByPredicate(Predicate predicate) { 
JPADeleteClause deleteClause = new JPADeleteClause(em, QPersonEntity.personEntity);
    em.joinTransaction();
    deleteClause.where(predicate).execute(); 
    }

这个问题已经8年了!!!而且它已经有一个有效的答案。你是在PostConstruct方法上手动创建自己的实体管理器吗?... 你为什么要这样做? - Iogui
上面的答案对我没用。现在有些人可能会遇到和我一样的问题,这就是全部。看不出有什么问题。 - Tomás Nunes
1
你在PostConstruct方法中手动创建实体管理器的事实让我感觉像是代码异味。请注意,问题说明它正在使用Spring Data,因此应该使用存储库。如果@Dhanush Gopinath的答案对你没有起作用,也许你做错了什么。看起来你在这里重新发明轮子。你有另一个好的理由在这种情况下手动创建实体管理器吗? - Iogui

-1
使用JPADeleteClause,将以下两个参数传递给它: entityManagerEntityPath QClass
QPersonEntity path = QPersonEntity.personEntity;
JPADeleteClause deleteClause = new JPADeleteClause(getEntityManager(), path);
deleteClause.where(path.name.eq("behrooz")).execute();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接