在OQL(对象查询语言)中是否有任何方法可以通过过滤掉匹配某个属性的所有对象来选择对象?
要递归访问Category
对象,我只需检索根类别。之后我通过FetchType.EAGER
访问它的children-property。
现在,当我删除一个Category时,我实际上并没有删除它,而是将deleted-property设置为true。对于修改/删除的类别,这可以很好地工作,但是当我访问children-属性时,我仍然会得到删除的类别对象。
我当前的OQL-Select获取根类别是这样的:
SELECT c FROM Category c WHERE c.name = 'Root'
是否有任何方法可以过滤掉所有具有Category.deleted = true
的类别对象?我是说递归,这样我就不会在children-属性中找到deleted-true-Categories ?
实体看起来像这样:
@Entity
@NamedQueries({
@NamedQuery(name = Category.FIND_CATEGORY_ROOT,
query = "SELECT c FROM Category c WHERE c.name = 'Root'")
})
public class Category implements Serializable {
private static final long serialVersionUID = 1L;
private static final String PREFIX = "Category.";
public static final String FIND_CATEGORY_ROOT = PREFIX + "findCategoryRoot";
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean deleted;
@OneToMany(fetch = FetchType.EAGER)
private List<Category> children;
// More code here
}
我认为你必须选择:
- 添加
c.name = 'Root' and c.deleted = false
命名查询 - 不使用命名查询,只需使用正常的
entityManager.createNamedQuery
并在那里添加过滤。
如果您的JPA提供程序是hibernate,您可以添加注释@Where(clause = 'c.deleted = false')
,它将被添加到所有查询