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

时间:2012-05-07 11:57:23

标签: java mysql jpa jpa-2.0 criteria-api

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

@Entity
public class Folder{

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

给定文件名,我想删除files == theGivenFileName 的所有条目。在sql中它将是这样的:

Delete from folder_files where files = XXX

有没有办法使用criteria-api执行此查询? 如果没有,有没有办法使用jpql执行此查询?

更新 我认为我的问题不够明确: 由于jpql使用实体(而不是表),我不能只执行上面写的sql,因为我正在使用@ElementCollection我不知道如何处理这个变量甚至处理它。我想从所有实体中删除该集合中的所有条目(在我的例子中,文件集),其中包含给定值。这可能是使用jpql或(甚至更好)标准-api?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Delete FROM子句需要一个Entity,因此无法从我理解的内容中删除元素集合。

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

答案 2 :(得分:1)

这不可能。通过JPQL它不起作用,因为DELETE语句只能应用于实体。摘自JPA 2.0规范:

  

批量更新和删除操作适用于单个实体的实体   class(连同它的子类,如果有的话)。
  ...
  delete_statement :: = delete_clause [where_clause]
  delete_clause :: = DELETE FROM entity_name [[AS] identification_variable]

它也不能通过Criteria API工作。 CriteriaQuery仅支持选择 - 不支持更新或删除。

您必须使用本机SQL。