使用JPA的具有节点计数的类别树结构
我有一个类别树结构,使用JPA和eclipse链接。 树中的每个类别都包含项目,我希望选择所有类别及其项目数 我继承的代码用于计算脱机项目的数量,更新类别,并使用很酷的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
@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")