日付プロパティの年を選択する JCR SQL2 クエリを実行したいと思います。このようなもの:
SELECT DATE_FORMAT([jcr:created], '%Y') FROM x
似たようなことはありますか=検索しても何も見つかりませんでしたが、検索が苦手だったので、以前にこのような回答があった場合は申し訳ありません。
ありがとう!
乾杯、エヴァン
JSR-283 仕様には、DATE フィールドの年 (または月、日、時刻) だけを取得する方法を概説するものはありません。目的を達成する唯一の方法は、(オブジェクト内の行またはノードを使用して) DATE 値をオブジェクトとして取得しjavax.jcr.query.QueryResult
、java.util.Calendar
クエリが次のような場合:
SELECT [jcr:created] AS dateField FROM [mix:created] ...
次の例は、行を使用してこれを行う方法を示しています。
javax.jcr.query.QueryResult result = query.execute();
RowIterator iter = result.getRows();
while ( iter.hasNext() ) {
Row row = iter.nextRow();
Value value = row.getValue("dateField");
// Our query won't return a null, since `jcr:created' is mandatory
// and autocreated on `mix:created`, so we don't have to check
// value for null. Other properties, however, may not be mandatory
// so you might need to check null for other queries ...
int year = value.getDate().get(Calendar.YEAR);
// do something with the year
}
value.getDate()
が実際の値を DATE に変換しようとすることを理解することが重要です。実際の値を変換できない場合、これにより例外が発生する可能性があります。
クエリに単一のセレクターがある場合 (たとえば、FROM
句内の単一のテーブル)、結果の各行には単一のノードが含まれ、上記のように行を使用するのではなく、次のように取得できますNodeIterator
。
javax.jcr.query.QueryResult result = query.execute();
NodeIterator iter = result.getNodes();
while ( iter.hasNext() ) {
Node node = iter.nextNode();
// The 'jcr:created' property is mandatory (and autocreated), so
// in our case we don't have to check if the property exists
// or handle a PathNotFoundException. And single-valued properties
// always have a value.
Value value = node.getProperty("jcr:created").getDate();
int year = value.getDate().get(Calendar.YEAR);
// do something with the year
}
エイリアスではなくプロパティ名を使用する必要があることに注意してください。