我有一个类别树结构,使用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实现中不支持的公式字段。
有关如何更改模型以使其发挥作用的任何想法?
提前致谢!
答案 0 :(得分:0)
如果您想要一个项目计数,您可以查询它,例如使用JPQL。这将返回一个Object [],包括Category和Integer项目计数。如果要使用本机SQL查询,则需要使用SqlResultSetMapping。
如果您希望在“类别”中计算项目数,则可以定义数据库VIEW,使其显示为列并映射到视图。
另一种选择是映射类别的项目,然后获取项目计数,只需访问Java中项目的大小()(您可以使用连接或批量提取来有效地加载项目)。