0

我想执行一个 JCR SQL2 查询,它选择我日期属性的年份。像这样的东西:

SELECT DATE_FORMAT([jcr:created], '%Y') FROM x

甚至可能有类似的东西吗=我已经搜索过但没有找到任何东西,但我可能只是在搜索中很糟糕,很抱歉,如果之前已经回答过这样的问题。

谢谢!

干杯,埃文

4

1 回答 1

0

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
}

请注意,我们必须使用属性名称而不是别名。

于 2014-04-11T14:20:59.203 回答