JCR SQL2查询:ISDescendantNode param的绑定



我正在编写一个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:query:query:select * select * from [cq:pageContent]其中isdescendantnode($ base($ base( *((( *((和([sling:resourceType] = $ resourceType(;:("

我知道我可以将参数值串联到查询中,但我认为这是一个不好的做法。

据我所知,通过阅读ISDESCENDANTOF中的JSR-283 SPEC path不允许可变绑定。JackRabbit文档中描述了相同的语法,其中包括漂亮的铁路图。

您是正确的,在SQL中,与用户输入直接连接查询是一种极为糟糕的做法。但是,与SQL相反,JCR-SQL2不允许您在内容存储库中执行更新。一旦获得了包含节点的结果集,您就需要明确使用JCR API进行操作。因此,这样的方式有些安全。另一方面,您仍然可以注入一个非常糟糕的性能的查询。

如果路径来自用户输入,您可以在这里做的是:

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

最新更新