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
}

我认为你必须选择:

  1. 使用 c.name = 'Root' and c.deleted = false
  2. 添加命名查询
  3. 不要使用命名查询,只使用普通的 entityManager.createNamedQuery 并在那里添加过滤。

如果您的 JPA 提供程序处于休眠状态,您可以添加注释 @Where(clause = 'c.deleted = false'),它将被添加到所有查询中。