在JCR SQL2中选择格式化日期

时间:2014-04-11 11:16:28

标签: java jcr jcr-sql2

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

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

类似的东西甚至可能=我已经搜索过但没有找到任何东西,但我可能只是吮​​吸搜索,很抱歉,如果之前已经回答了这样的话。

谢谢!

干杯, 埃文

1 个答案:

答案 0 :(得分: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
}

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