5

我正在使用 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

有没有办法使用条件 API 执行此查询?如果没有,有没有办法使用 jpql 执行这个查询?

更新: 我认为我的问题不够清楚:因为 jpql 使用实体(而不是表),所以我不能只执行上面写的 sql,因为我正在使用@ElementCollection我不知道如何解决这个变量,甚至不知道如何处理它。我想从所有实体中删除该集合中包含给定值的所有条目(在我的情况下为文件集)。使用 jpql 或(甚至更好的)criteria-api 是否可能?

4

3 回答 3

3

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

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

于 2012-05-07T13:40:29.327 回答
1

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

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

于 2012-05-07T12:41:01.847 回答
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。

于 2012-07-20T10:52:43.437 回答