-2

我有两个实体。一个是 Product,另一个是 ProductCategory。Product 到 ProductCategory 的关系是多对一。我有一种方法来获取所有 ProductCategories。我想向 ProductCategory 添加一个瞬态变量 productCount,它说明有多少产品可用对于每个 ProductCategory。我有 2 个解决方案。两者都工作正常。

解决方案 1

public List<ProductCategory> getProductCategoryList() {

List<ProductCategory> productCategoryList = this
            .getCurrentSession()
            .createQuery(
                    "SELECT pc FROM ProductCategory pc")
            .list();

    for (ProductCategory category : productCategoryList) {
        String categoryId = category.getId().toString();
        category.setProductsCount(getCurrentSession()
                .createQuery(
                        "SELECT p FROM Product p WHERE  p.productCategory.id=:categoryId")
                .setParameter("categoryId", Long.parseLong(categoryId))
                .list().size());
    }
return productCategoryList;
}

解决方案 2

public List<ProductCategory> getProductCategoryList() {

List<ProductCategory> productCategoryList = new ArrayList<ProductCategory>();
    List<Object[]> resultList = this.getCurrentSession()
            .createQuery("FROM Product p  right join  p.productCategory")
            .list();

    for (Object[] array : resultList) {
        Product product = null;
        ProductCategory productCategory = null;

        if (array[1] != null) {
            productCategory = (ProductCategory) array[1];
        }
        if (array[0] != null) {
            product = (Product) array[0];
            productCategory.setProductsCount(productCategory
                    .getProductsCount() == null ? 1 : productCategory
                    .getProductsCount() + 1);

        }
        if (productCategory != null
                && !productCategoryList.contains(productCategory)) {

            productCategoryList.add(productCategory);

        }

    }

    return productCategoryList;
}

这两个更好的解决方案是什么?或者任何其他更好的解决方案?我对休眠中的性能比较没有充分的了解。

4

2 回答 2

1

如果您总是要获得此“属性”,那么我认为您可以使用@FormulaPOJO 并让它更加透明。

像这样的东西ProductCategory.java(需要测试):

@Formula("(select count(*) from Product p where p.productCategory.id = id)")
private Long productsCount;

其中 id 是 id 上的字段ProductCategory.java

编辑
顺便说一句,现在不要担心性能。只要让代码清晰。一旦你让它运行和工作,你可以分析系统并查看它需要调整的地方。

于 2013-05-02T12:32:40.037 回答
1

这两种解决方案都很复杂,并且从数据库中加载所有类别的产品。如果您准备这样做,为什么不简单地使关联双向,并简单地调用category.getProducts().size()以获取您的计数?

如果你真的不想这样做,那么你应该简单地执行一个查询来获取类别,然后执行一个额外的查询来从数据库中获取他们的产品数量:

select category.id, count(product.id) from Product product
inner join product.category category
where category.id in :categoryIds
group by category.id

这将返回一个List<Object[]>,其中每个都Object[]包含一个类别 ID,以及相关的产品数量。

于 2013-05-02T12:32:47.767 回答