使用JPA的节点计数的类别树结构

时间:2013-06-09 11:04:10

标签: jpa eclipselink self-join

我有一个类别树结构,使用JPA和eclipse链接。 树中的每个类别都包含项目,我想选择所有类别及其项目数。

我继承的代码用于离线计算项目数,并更新类别,并使用酷JPA技巧来选择类别如下:

@Entity
@Table(name = "categories")
@NamedNativeQuery(name = "topLevel", query = "SELECT categories.* FROM categories WHERE categories.parent_id IS NULL")
public class Category {
    @Id
    private Long id;
    private String name;
    private Integer item_count;
    private Long parent_id;

    @JoinColumn(name = "parent_id")
private List<Categories> categories;
}

运行本机查询时 - 我会在树结构中填充所有类别。

但是,现在我有一个新的过滤器,不允许用户查看该类别中的所有项目。所以我无法再离线计算这些项目。 我尝试使用连接,所以我可以在线计算,如下:

@NamedNativeQuery(name = "topLevel", query = "SELECT categories.*, count(*) as item_count FROM categories, items_to_categories WHERE categories.id = items_to_categories.category_id and some_user_specific_query and categories.parent_id IS NULL GROUP BY categories.id")

但是这并没有填充正确的项目数量的较低级别。

由于我使用的是Eclipse Link,因此我无法使用此JPA实现中不支持的公式字段。

有关如何更改模型以使其发挥作用的任何想法?

提前致谢!

1 个答案:

答案 0 :(得分:0)

如果您想要一个项目计数,您可以查询它,例如使用JPQL。这将返回一个Object [],包括Category和Integer项目计数。如果要使用本机SQL查询,则需要使用SqlResultSetMapping。

如果您希望在“类别”中计算项目数,则可以定义数据库VIEW,使其显示为列并映射到视图。

另一种选择是映射类别的项目,然后获取项目计数,只需访问Java中项目的大小()(您可以使用连接或批量提取来有效地加载项目)。