-2

2 つのエンティティがあります。1 つは Product で、もう 1 つは ProductCategory です。Product と ProductCategory の関係は多対 1 です。 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;
}

これら2つのより良い解決策は何ですか? または他のより良い解決策はありますか?休止状態でのパフォーマンスの比較については、十分な知識がありません。

4

2 に答える 2

1

@Formula常にこの「プロパティ」を取得する場合は、POJO を使用して、これをより透過的にすることができると思います。

このようなものProductCategory.java(テストが必要):

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

id は の id フィールドProductCategory.javaです。

EDIT
ところで、今はパフォーマンスについて心配する必要はありません。コードを明確にするだけです。実行して動作させると、システムのプロファイルを作成して、調整が必要な場所を確認できます。

于 2013-05-02T12:32:40.037 に答える
1

これらのソリューションは両方とも複雑で、データベースからカテゴリのすべての製品をロードします。それを行う準備ができている場合は、単純に関連付けを双方向にして、単純に呼び出しcategory.getProducts().size()てカウントを取得してみませんか?

本当にそうしたくない場合は、単純にクエリを実行してカテゴリを取得してから、追加のクエリを 1 つ実行してデータベースから製品数を取得する必要があります。

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 の 1 つと関連する製品数を含むを返します。

于 2013-05-02T12:32:47.767 に答える