Java JPA OQL 递归过滤器
Java JPA OQL recursive filter
在 OQL(Object 查询语言)中有什么方法可以 select 一个 object,通过过滤掉所有匹配某个 属性 的 object ]?
要递归访问 Category
object,我只检索 root-Category。后来我通过 FetchType.EAGER
.
访问它的 children-property
现在,当我删除一个类别时,我实际上并没有删除它,而是将 deleted-property 设置为 true。这适用于 modified/deleted 类别,但是当我访问 children-property 时,我仍然得到已删除的类别 objects.
我当前 OQL-Select 得到 root-Category 看起来像这样:
SELECT c FROM Category c WHERE c.name = 'Root'
有什么方法可以过滤掉所有有Category.deleted = true
的Category-objects吗?我的意思是递归,这样我就不会在 children-property?
中找到 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 提供程序处于休眠状态,您可以添加注释 @Where(clause = 'c.deleted = false')
,它将被添加到所有查询中。
在 OQL(Object 查询语言)中有什么方法可以 select 一个 object,通过过滤掉所有匹配某个 属性 的 object ]?
要递归访问 Category
object,我只检索 root-Category。后来我通过 FetchType.EAGER
.
现在,当我删除一个类别时,我实际上并没有删除它,而是将 deleted-property 设置为 true。这适用于 modified/deleted 类别,但是当我访问 children-property 时,我仍然得到已删除的类别 objects.
我当前 OQL-Select 得到 root-Category 看起来像这样:
SELECT c FROM Category c WHERE c.name = 'Root'
有什么方法可以过滤掉所有有Category.deleted = true
的Category-objects吗?我的意思是递归,这样我就不会在 children-property?
实体如下所示:
@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 提供程序处于休眠状态,您可以添加注释 @Where(clause = 'c.deleted = false')
,它将被添加到所有查询中。