我想执行一个 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,它将尝试将其转换为 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
}
请注意,我们必须使用属性名称而不是别名。