Java JPA OQL递归过滤器

Java JPA OQL递归过滤器,java,jpa,properties,entity,oql,Java,Jpa,Properties,Entity,Oql,在OQL对象查询语言中,是否有任何方法可以通过过滤掉与某个属性匹配的所有对象来选择对象 要递归访问类别对象,我只需检索根类别。稍后,我通过FetchType.EAGER访问它的子属性 现在,当我删除一个类别时,实际上我不会删除它,而是将deleted属性设置为true。这适用于修改/删除的类别,但当我访问children属性时,仍然会得到已删除的类别对象 我当前选择OQL以获取根类别,如下所示: SELECT c FROM Category c WHERE c.name = 'Root' @E

在OQL对象查询语言中,是否有任何方法可以通过过滤掉与某个属性匹配的所有对象来选择对象

要递归访问类别对象,我只需检索根类别。稍后,我通过FetchType.EAGER访问它的子属性

现在,当我删除一个类别时,实际上我不会删除它,而是将deleted属性设置为true。这适用于修改/删除的类别,但当我访问children属性时,仍然会得到已删除的类别对象

我当前选择OQL以获取根类别,如下所示:

SELECT c FROM Category c WHERE c.name = 'Root'
@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
}
是否有任何方法可以过滤掉具有Category.deleted=true的所有类别对象?我的意思是递归,这样我就不会在children属性中找到已删除的真实类别了

实体如下所示:

SELECT c FROM Category c WHERE c.name = 'Root'
@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',c.deleted=false 不要使用命名查询,只需使用普通的entityManager.createNamedQuery并在其中添加筛选。
如果您的JPA提供者是hibernate,您可以添加注释@Whereclause='c.deleted=false',它将被添加到所有查询中。

OQL?JPAAPI不做OQL。是的,你说得对。谢谢关于JPQL双向递归的好教程也会有所帮助。很遗憾,我还没有很成功地找到一个。是的,我使用Hibernate作为JPA提供程序。好吧,你的建议的第一条现在会起作用,因为它只过滤第一个对象,而不过滤它的子对象。我不太明白你的第二个建议。如何将筛选添加到entityManager.createNamedQuery?您可以动态构建JPQL。i、 e String queryStr=从c类中选择c,其中c.name=:categoryName;iffilterDeleted queryStr+=和c.isDeleted=FALSE;entityManager.createTypedQueryqueryStr,Category.class;当然,逻辑可能更复杂一些。我当前的JPQL查询是这样的:从c类中选择c,其中c.name='Root'和c.deleted=FALSE,但是所有deleted=TRUE和deleted=FALSE的对象仍然被加载。语法有问题吗?要获取数据,我使用em.createNamedQuery…getSingleResult。其余的则是使用Collection.size懒洋洋地加载的。对不起,我不明白。如果第一行是查询的唯一行,则getSingleResult返回第一行。否则,应使用.setMaxResults1.getResultList。列表的大小将为1或0。我在第一步中所做的是使用FetchType.Lazy加载根类别。在第二步中,我从这个根类别中获取子类别。由于延迟加载,我首先调用childCategory.getChildren.size;加载它们,然后在循环中遍历子类别。我一直递归地这样做。如果我点击从类别c中选择c,其中c.name='Root'和c.deleted=FALSE,它只检查根类别的c.deleted=FALSE,而不检查其子类别。