QueryDSL删除方法

Posted

技术标签:

【中文标题】QueryDSL删除方法【英文标题】:QueryDSL delete method 【发布时间】:2013-04-25 06:56:54 【问题描述】:

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

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

有解决办法吗?

【问题讨论】:

【参考方案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 方法上手动创建自己的实体管理器?...为什么要这样做? 上面的答案对我不起作用。有些人可能会遇到和我现在一样的问题,仅此而已。看不出问题所在 您在 PostConstruct 方法中手动创建实体管理器这一事实在我看来就像是代码异味。请注意,该问题指出它正在使用弹簧数据,因此可能应该使用存储库。如果@Dhanush Gopinath 的答案对您不起作用,那么您可能做错了什么。看来你在这里重新发明了***。在这种情况下,您是否有另一个好的动机来手动创建实体管理器?【参考方案2】:

使用 JPADeleteClause,将以下两个参数传递给它: entityManagerEntityPath QClass

QPersonEntity path = QPersonEntity.personEntity;
JPADeleteClause deleteClause = new JPADeleteClause(getEntityManager(), path);
deleteClause.where(path.name.eq("behrooz")).execute();

【讨论】:

【参考方案3】:

你可能能做的就是这个。使用“where”条件的谓词,查询对象,然后将其传递给删除方法

QMyObj obj= new QMyObj("myObj");
Iterable<MyObj> myObjs = myObjRepository.findAll(obj.property.eq("property"));
myObjRepository.delete(myObjs);

这里我首先创建一个 Q 类的实例,然后根据谓词查找所有对象。然后调用存储库的void delete(Iterable&lt;? extends T&gt; entities) 方法。

可能是因为他们没有提供这种解决方法,但这是由 Spring Source 人员确认的

【讨论】:

有一个更好的解决方案 - 看看这个答案***.com/a/23731038/1125467 这是否是更好的解决方案,取决于您的谓词有多复杂。

以上是关于QueryDSL删除方法的主要内容,如果未能解决你的问题,请参考以下文章

Querydsl.JPQLQuery 获取记录数

Mockito QueryDSL

Querydsl喜欢惊喜

通用代码因 Spring 数据和 Querydsl 而失败

附加 QueryDSL 谓词或基于过滤器值构建谓词

Querydsl 空安全连接