JCR SQL2查询:ISDESCENDANTNODE参数的绑定

时间:2019-05-13 12:45:51

标签: java aem jcr

我正在编写一个JCR SQL2查询,该查询列出了给定类型的所有特定路径的后代节点。 当我这样写查询时:

Query query = queryManager.createQuery(
    "SELECT * FROM [cq:PageContent] where ISDESCENDANTNODE(\"/content\") AND ([sling:resourceType] = $resourceType)", Query.JCR_SQL2);
query.bindValue("resourceType", session.getValueFactory().createValue("my-type"));

它工作正常,但是当我尝试像这样绑定ISDESCENDANTNODE下的内容时:

Query query = queryManager.createQuery(
    "SELECT * FROM [cq:PageContent] where ISDESCENDANTNODE($base) AND ([sling:resourceType] = $resourceType)", Query.JCR_SQL2);
query.bindValue("base", session.getValueFactory().createValue("/content"));
query.bindValue("resourceType", session.getValueFactory().createValue("my-type"));

query.bindValue(“ base”,...)引发异常:

  

“ javax.jcr.query.InvalidQueryException:java.text.ParseException:查询:SELECT * FROM [cq:PageContent]其中ISDESCENDANTNODE($ base(*))AND([sling:resourceType] = $ resourceType);应为:)“

我知道我可以将参数值连接到查询中,但是我认为这是一个坏习惯。

1 个答案:

答案 0 :(得分:1)

据我所知,通过阅读path中的JSR-283 spec ISDESCENDANTOF不允许进行变量绑定。 Jackrabbit documentation中描述了相同的语法,其中包括清晰易读的铁路图。

您是对的,在SQL中直接将查询与用户输入直接连接是一种极其糟糕的做法。但是,与SQL相反,JCR-SQL2不允许您在内容存储库中执行更新。一旦获得包含节点的结果集,就需要显式使用JCR API。因此,这样比较安全。另一方面,您仍然可以插入性能极差的查询。

如果路径来自用户输入,则您可以在此处执行以下操作:

  1. 从任何地方读取path参数
  2. 使用org.jackrabbit.util.Text编码路径,或使用您选择的其他验证/转义方法。
  3. 将路径与查询的其余部分连接起来,并通过绑定其余变量来准备它(或者如果路径无效,则不要这样做)