Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JPA的具有节点计数的类别树结构_Jpa_Eclipselink_Self Join - Fatal编程技术网

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

使用JPA的具有节点计数的类别树结构,jpa,eclipselink,self-join,Jpa,Eclipselink,Self Join,我有一个类别树结构,使用JPA和eclipse链接。 树中的每个类别都包含项目,我希望选择所有类别及其项目数 我继承的代码用于计算脱机项目的数量,更新类别,并使用很酷的JPA技巧选择类别,如下所示: @Entity @Table(name = "categories") @NamedNativeQuery(name = "topLevel", query = "SELECT categories.* FROM categories WHERE categories.parent_id IS NU

我有一个类别树结构,使用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;
}
但这并没有用正确的项目计数填充较低级别

因为我使用的是Eclipse链接,所以我不能使用这个JPA实现中不支持的公式字段

有没有关于如何更改我的模型以使其工作的想法


提前谢谢

如果您想要一个项目计数,您可以查询它,比如使用JPQL。这将返回一个对象[],包括类别及其整数项计数。如果要使用本机SQL查询,则需要使用SqlResultSetMapping

如果要在类别中显示项目计数,则可以定义一个数据库视图,使其显示为列并映射到该视图


另一个选项是映射类别中的项目,然后要获取项目计数,只需访问Java中项目的size()(您可以使用联接或批处理获取来高效加载项目)。

是否可以不进行任何其他查询?这就是我现在正在做的,但它并不优雅,而且会增加延迟。另一个选项不好,因为它是一个树,计数将只返回当前级别,或子类别计数,而不进一步下降到较低级别。另一个选项是在每次将项目添加到树或其任何子级时更新itemCount。您可以在addItem()方法中执行此操作。
@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")