如何在JPA中批量删除元素集合

5

我正在使用jpa 2.0,并有以下实体:

@Entity
public class Folder{

    @ElementCollection
    @CollectionTable(name="folder_files")
    private Set<String> files;      
    // .....
 }

给定一个文件名,我想删除所有文件等于所给文件名的条目。在SQL中,它可能是这样的:

Delete from folder_files where files = XXX

有没有办法使用Criteria-API执行此查询?如果不行,是否有办法使用JPQL执行此查询?
更新: 我认为我的问题不够清晰: 由于JPQL使用实体(而不是表),因此我不能仅执行上面编写的SQL,另外,由于我正在使用@ElementCollection,我不知道如何处理此变量。 我想删除该集合中所有条目(在我的情况下是文件集)中保存的给定值,从所有实体中删除。 是否可以使用JPQL或(更好的是)Criteria-API实现这一点?
3个回答

3

根据我的理解,Delete FROM子句需要一个实体,因此我认为无法从元素集合中删除。

您可以使用本地SQL查询,或将元素集合映射为OneToMany到实体。


谢谢您的回复。为什么您认为无法使用JPQL呢?您能否给我一个支持这一观点的参考资料呢? 顺便说一下,我已经更新了我的问题。 - Noam

1

您可以使用类似查询,只是语法略有改变。

query = em.createQuery("SELECT i FROM Item i WHERE UPPER(i.name) LIKE :keyword ");
query.setParameter("keyword", "%" + keyword.toUpperCase() + "%");

您可以在以下链接上阅读更多内容:

https://forums.oracle.com/forums/thread.jspa?threadID=423742

更新:

@Noam,你可以做到:就像在 Criteria API 中一样。

List cats = sess.createCriteria(Cat.class)
    .add( Restrictions.like("name", "Fritz%") )
    .add( Restrictions.between("weight", minWeight, maxWeight) )
    .list();

请在以下链接中详细了解:

http://ctpconsulting.github.com/query/1.0.0.Alpha3/criteria.html

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html


谢谢回复,但是你知道如何使用Criteria API执行它吗? - Noam
我更新了我的问题,请看一下,如果您仍然能帮助我,我会很高兴。 - Noam

1
这是不可能的。通过JPQL无法实现,因为DELETE语句只能应用于实体。摘自JPA 2.0规范:
批量更新和删除操作仅适用于单个实体类(以及其子类,如果有)。... delete_statement :: = delete_clause [where_clause] delete_clause :: = DELETE FROM entity_name [[AS] identification_variable]
此外,通过Criteria API也无法实现。 CriteriaQuery仅支持选择 - 不支持更新或删除。
您必须使用本地SQL。

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