0

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

我继承的代码用于离线计算项目数,更新类别,并使用很酷的 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 实现中不支持的公式字段。

关于如何更改我的模型以使其正常工作的任何想法?

提前致谢!

4

1 回答 1

0

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

如果您希望类别中的项目计数,那么您可以定义一个数据库视图,使其显示为列并映射到视图。

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

于 2013-06-10T14:13:17.943 回答