1

このクエリをどのようにフォーマットするのか疑問に思っています。3 つの日付を持つテーブルがあり、一部は null になる可能性があります。3 つのフィールドは、createdDate、downDate、および fixDate です。日付に応じて最新のエントリを照会して取得する必要があります。たとえば、fixDate が null でない場合は fixDate で注文し、null の場合は downDate で注文する必要があります。downDate が null の場合、createdDate で並べ替えます。

mySQL 経由で、次を使用して正しい結果が得られます。

SELECT * FROM history WHERE equipment_id=88 ORDER BY IF(ISNULL(fix_date), IF(ISNULL(down_date), created_date, down_date), fix_date) DESC;

これをgrailsプロジェクトに入れようとしていて、HQLを使用して試しました(これの他のバリエーションも試しました):

History.executeQuery("SELECT FROM History WHERE equipment=:eqpt ORDER BY " +
"IF(ISNULL(fixDate), IF(ISNULL(downDate), createdDate, downDate), fixDate) DESC", [eqpt:equipment])

また試しました:

   History.executeQuery("SELECT FROM History WHERE equipment=:eqpt ORDER BY " +
    "IF(COALESCE(fixDate,downDate,createdDate) DESC", [eqpt:equipment])

私が得るエラーは次のとおりです。

nexpected token: FROM near line 1, column 8 [SELECT FROM com...History WHERE equipment=:eqpt ORDER BY IF(COALESCE(fixDate, downDate, createdDate) DESC]

createCriteria ソリューションもあれば、それで問題ありません。ありがとう。

4

1 に答える 1

2

試したことはありませんが、Hibernate のドキュメントによると、coalesce() は「where」句でサポートされています。「select」句でも利用できる場合は、ドキュメントにも記載されているように、結合された日付を選択してから並べ替えることができます

「クエリによって返されるリストは、返されたクラスまたはコンポーネントの任意のプロパティで並べ替えることができます」

したがって、おそらく次のようなものです。

 select h.prop1, h.prop2, coalesce(h.fixDate, h.downDate, h.createdDate) as orderDate from history h where ..... order by orderDate
于 2012-09-24T23:05:17.970 に答える