1

このSQLリクエストをQueryDSL JPAで実行したい

SELECT authorizationitem.* 
FROM authorizationitem 
INNER JOIN 
(
    SELECT `authorize` 
    FROM authorizationitem 
    GROUP BY `authorize` 
    HAVING COUNT(*)>1
) a2 
    ON authorizationitem.`authorize` = a2.`authorize`;

テーブル内の重複した行を見つけるには、このリクエストを実行する必要があります。しかし、QueryDSL では、これを記述する方法が見つかりません。

QueryDSL は、Inner Join :s で subQuery を許可していないようです

なにか提案を?

ありがとうございます。それでは、お元気で、

4

2 に答える 2

1

これはHQL/JPQLでは表現できないので、SQLで表現する必要があります。Querydsl JPA は、その API を介して JPQL クエリと SQL クエリの両方を表現する可能性を提供します。

于 2012-10-10T06:45:30.387 に答える
0

WHERE 句でサブクエリを使用してみることができますが、FROM 句でのサブクエリよりも効率が悪い可能性があります。結合と GROUP BY を最適化するために、authorizeitem.authorize にインデックスがあることを確認してください。

SELECT authorizationitem.* 
FROM authorizationitem 
WHERE EXISTS (
    SELECT `authorize` 
    FROM authorizationitem2 
   WHERE authorizationitem2.authorize = authorizationitem.authorize
    GROUP BY `authorize` 
    HAVING COUNT(*)>1
);

また

SELECT authorizationitem.* 
FROM authorizationitem 
WHERE (
    SELECT count(*)
    FROM authorizationitem2 
   WHERE authorizationitem2.authorize = authorizationitem.authorize
    GROUP BY `authorize` 
) > 1;
于 2012-10-09T16:42:26.060 に答える