JCR,JackRabbit:使用XPath搜索日期年份和子节点属性值

时间:2012-06-13 13:19:17

标签: jackrabbit jcr

!素不相识 我对以下问题感到非常不安......我会尽可能地保持清醒。 目前我在我们的Web应用程序中运行了Jackrabbit JCR实现。一切正常,但在尝试进行特定搜索时会出现一点点(大)问题。

为了简要概述存储什么类型的数据,我们有一个名为“Entry”的节点类,它扩展了另一个名为“BaseEntry”的节点类,并扩展了另一个名为“BaseNode”的节点类。 Entry类在我们的JCR系统中表示一个Node,并且具有一组属性(在相应的类中映射为属性),并且还继承了在它们的超类中映射的属性。

我复制并粘贴了类定义的重要部分和感兴趣的属性......

@Node(jcrType = "entry",  extend = BaseEntry.class)
public class Entry extends BaseEntry {

  ... // nothing really important here
}

@Node(jcrType = "baseEntry", extend = BaseNode.class, isAbstract = true)
public abstract class BaseEntry extends BaseNode {

  @Collection (jcrType = "attachment",
      collectionConverter = NTCollectionConverterImpl.class)
  protected List<Attachment> attachments = new ArrayList<Attachment>();

  ...

}

@Node(jcrType = "baseNode", isAbstract = true)
public abstract class BaseNode {

  @Field(jcrName = "name", id = true)
  protected String name;

  @Field(jcrName = "creationDate")
  protected Date creationDate;

  ...
}

1)我如何制作一个谓词,只选择属性creationDate中具有特定的节点(条目),忽略其余部分。该属性的类型为Date(在类中),我想该属性存储在xs:DateTime格式中我猜...我真的不太清楚......它是如何真正匹配JCR底层系统中的Date

到目前为止,我对此... ... 必须有这样的//element(*, entry)[getYear(@creationDate) == <year>]

必须是整数,字符串,......我真的不知道。

2)我如何制作一个谓词,只选择那些包含具有某个名称的附件的节点(条目)。

类附件,重要部分......

@Node(jcrType = "attachment", discriminator = true)
public class Attachment extends BaseNode implements Comparable<Attachment> {
  ...
}

到目前为止,我已经达到了......这是有效的..但必须有更好的方法:

//element(*, entry) [jcr:contains(./*,'<nameOfInterest>')]

所有朋友,我真的为缺乏信息而道歉,我可能需要读者更好地理解问题的背景,我想这就是我能做的。我对Jackrabbit和JCR很新,而且我不得不接受它(肮脏),不知道我在做什么......而且不经意的是它开始变得非常复杂......

希望任何慈善机构的灵魂能够回答这个问题,并帮助,至少一点:D。 谢谢你提前。 问候。 维克托。

1 个答案:

答案 0 :(得分:1)

我不是专家,但无论如何我都试着回答:

问题1

//element(*, entry)[getYear(@creationDate) == <year>]

我认为你可以使用:

//element(*, entry)[
    @creationDate >= '2001-01-01T00:00:00.0' 
and @creationDate < '2002-01-01T00:00:00.0']

问题2

仅选择包含名称具有特定名称的附件的节点(条目)。

我只知道SQL-2查询,在节点名称上使用相等。我不确定这是不是你要找的东西:

select * from [nt:base] where name() = '<nameOfInterest>'