Java JCR SQL2查询:ISDESCENDATNODE参数的绑定

Java JCR SQL2查询:ISDESCENDATNODE参数的绑定,java,aem,jcr,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(

我正在编写一个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"));
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"));
它工作得很好,但当我尝试绑定ISDESCENDANTNODE下的内容时,如下所示:

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"));
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:从[cq:PageContent]中选择*,其中IsDescendatNode($base(*)和([sling:resourceType]=$resourceType);应为:)”


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

据我所知,读取
isdescendatof
中的
路径
不允许变量绑定。中描述了相同的语法,其中包括可读性很强的铁路图

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

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

  • 从任何位置读取
    路径
    参数
  • 使用或使用您选择的其他验证/转义方法对路径进行编码
  • 将路径与查询的其余部分连接起来,并通过绑定其余变量来准备它(如果路径无效,则不要这样做)