我正在使用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?
答案 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。