1

JPQLのDISTINCTで混乱しています。そのうちの1つに「DISTINCT」を除いて同一の2つのJPQLクエリがあります。

String getObjectsForFlow =
    "SELECT  " +
    "    se.componentID " +
    "FROM " +
    "    StatisticsEvent se " +
    "WHERE " +
    "    se.serverID IS NOT NULL " +
    "    AND se.flowID = :uuid " +
    "    AND se.componentID IS NOT NULL " +
    "ORDER BY " +
    "    se.timeStamp desc ";

String getObjectsForFlowDistinct =
    "SELECT DISTINCT " +
    "    se.componentID " +
    "FROM " +
    "    StatisticsEvent se " +
    "WHERE " +
    "    se.serverID IS NOT NULL " +
    "    AND se.flowID = :uuid " +
    "    AND se.componentID IS NOT NULL " +
    "ORDER BY " +
    "    se.timeStamp desc ";

少しのコードを実行して各クエリの結果を取得し、それらを stdout にダンプします。不明確な場合はいくつかの重複を含む多くの行を取得しますが、不明確な場合は、不明確なリストの一部である行を 1 つだけ取得します。

NOT DISTINCT
::: 01e2e915-35c1-6cf0-9d0e-14109fdb7235
::: 01e2e915-35c1-6cf0-9d0e-14109fdb7235
::: 01e2e915-35d9-afe0-9d0e-14109fdb7235
::: 01e2e915-35d9-afe0-9d0e-14109fdb7235
::: 01e2e915-35bd-c370-9d0e-14109fdb7235
::: 01e2e915-35bd-c370-9d0e-14109fdb7235
::: 01e2e915-35aa-1460-9d0e-14109fdb7235
::: 01e2e915-35d1-2460-9d0e-14109fdb7235
::: 01e2e915-35e1-7810-9d0e-14109fdb7235
::: 01e2e915-35e1-7810-9d0e-14109fdb7235
::: 01e2e915-35d0-12f0-9d0e-14109fdb7235
::: 01e2e915-35b0-cb20-9d0e-14109fdb7235
::: 01e2e915-35a8-66b0-9d0e-14109fdb7235
::: 01e2e915-35a8-66b0-9d0e-14109fdb7235
::: 01e2e915-35e2-6270-9d0e-14109fdb7235
::: 01e2e915-357f-33d0-9d0e-14109fdb7235
DISTINCT
::: 01e2e915-35e2-6270-9d0e-14109fdb7235

他のエントリはどこにありますか? 11 個の (私が思うに) エントリを含む DISTINCT リストが期待されます。

4

4 に答える 4

0

Oracle は、ORDER BY 列が SELECT に含まれていない限り、ORDER BY を使用した SELECT DISTINCT をサポートしません。データベースがあるかどうかはわかりません。DISTINCT が必要ない場合 (行が一意であるため実行されない場合)、Oracle で動作しますが、実行する必要がある場合はエラーが発生します。

「ORA-01791: SELECT された式ではありません」というメッセージが表示されます。

EclipseLink を使用している場合、この機能は DatabasPlatform メソッドによって制御されます。

shouldSelectDistinctIncludeOrderBy()

データベースでこれが必要ない場合は、false を返すようにプラットフォームを拡張できます。

それでも、TIMESTAMP を追加するとクエリ結果がどのように変わるかわかりませんか?

于 2013-07-11T13:17:28.073 に答える
0

ORDER BY 句が選択リストにない項目を参照しているため、どちらのクエリも正しくない JPQL クエリです。JPA 2.0 仕様には、このケースに一致する例が含まれています。

次の 2 つのクエリは、orderby_item がクエリの SELECT 句に反映されていないため、正しくありません。

SELECT p.product_name FROM Order o JOIN o.lineItems l JOIN l.product p JOIN o.customer c
WHERE c.lastname = 'Smith' AND c.firstname = 'John'<br> ORDER BY p.price

SELECT p.product_name
FROM Order o, IN(o.lineItems) l JOIN o.customer c
WHERE c.lastname = 'Smith' AND c.firstname = 'John' ORDER BY o.quantity

もちろん、間違ったクエリの予想される結果を推測しようとするのではなく、実装が明確なエラー メッセージを表示できれば、より良いでしょう。

于 2013-07-15T20:15:47.250 に答える