1

私は非常に単純かもしれない何かに髪を引き裂いていますが、それを正しくすることはできません.

GroupBy 句が、EclipseLink によって生成された SQL に追加されていません。

以下のコードのさまざまな順序とバリエーションを試しました。

public List<Orders> findOrdersEntitiesBySearch(int maxResults, int firstResult, String column1, String column2, String key, boolean searchOrder) {
    EntityManager em = getEntityManager();
    try {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaQuery<Orders> cq = cb.createQuery(Orders.class);
        Root<Orders> order = cq.from(Orders.class);
        Join<Orders, Products> prod = order.join("productsCollection");

        // Where like key
        if (column1 != null && column2 != null) {
            if (searchOrder) {
                cq.where(cb.or(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(order.get(column2).as(String.class)), "%" + key.toLowerCase() + "%")));
            } else {
                cq.where(cb.or(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"), cb.like(cb.lower(prod.get(column2).as(String.class)), "%" + key.toLowerCase() + "%")));
            }
        } else {
            if (searchOrder) {
                cq.where(cb.like(cb.lower(order.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"));
            } else {
                cq.where(cb.like(cb.lower(prod.get(column1).as(String.class)), "%" + key.toLowerCase() + "%"));
            }
        }

        // Order By
        List<Order> orderByList = new ArrayList<Order>();
        orderByList.add(cb.desc(order.get("ordDate")));
        orderByList.add(cb.desc(order.get("pkOrdID")));
        cq.orderBy(orderByList);

        // Select
        cq.select(order);

        // Group by
        //cq.groupBy(order.get("pkOrdID"));
        //Expression<Integer> grouping = order.get("pkOrdID").as(Integer.class);
        Expression<String> grouping = order.get("pkOrdID").as(String.class);
        cq.groupBy(grouping);

        Query q = em.createQuery(cq);
        q.setMaxResults(maxResults);
        q.setFirstResult(firstResult);

        return q.getResultList();
    } finally {
        em.close();
    }
}

コードは正常に実行され、結果が得られますが、GroupBy 句が含まれていません。

厄介なクイックフィックスとして、関数から返されたリストを実行して、解決策が見つかるまで重複を削除しています。

よろしくお願いいたします。

デビッド

4

1 に答える 1

0

わかりやすくするために、通常の JPQL クエリとして書き直します。現在、次のようなものがあります。

SELECT o
    FROM Orders o JOIN o.productsCollection p
    WHERE ...
    GROUP BY o.pkOrdID...

ここには 2 つの問題があります。まず、group by は正しくありません。これは、完全なオブジェクトが選択されている場合、単一の列で group by を実行できないためです。標準 SQL と同様に、集計ではない選択されたすべての列を group by にリストする必要があります。2 番目の問題は、ここでは group by がまったく必要ないことです。オプションについては、以下を参照してください。

ここでは集計関数を使用しないため、実際に必要なのは次のとおりです。

SELECT DISTINCT o
    FROM Orders o JOIN o.productsCollection p
    WHERE ...

したがって、条件 API クエリから group-by を削除し、cq.distinct(true)代わりに使用してください。

選択したオブジェクトの主キーでグループ化するのではなく、別のクエリの集計関数でグループ化する必要がある場合、JPA ではオブジェクト自体でグループ化します。簡単な JPQL の例は次のようになります。

SELECT o, sum(p.quantity)
    FROM Orders o JOIN o.productsCollection p
    WHERE ...
    GROUP BY o

クエリでは、これは になりますcq.groupBy(order)

ところで。エラーを報告するのではなく、ここでEclipseリンクが単にあなたのグループを無視する理由がわかりません。どのバージョンを使用していますか?

于 2012-02-20T22:01:43.440 に答える