我正在编写一个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);应为:)“
我知道我可以将参数值连接到查询中,但是我认为这是一个坏习惯。
答案 0 :(得分:1)
据我所知,通过阅读path
中的JSR-283 spec ISDESCENDANTOF
不允许进行变量绑定。 Jackrabbit documentation中描述了相同的语法,其中包括清晰易读的铁路图。
您是对的,在SQL中直接将查询与用户输入直接连接是一种极其糟糕的做法。但是,与SQL相反,JCR-SQL2不允许您在内容存储库中执行更新。一旦获得包含节点的结果集,就需要显式使用JCR API。因此,这样比较安全。另一方面,您仍然可以插入性能极差的查询。
如果路径来自用户输入,则您可以在此处执行以下操作:
path
参数org.jackrabbit.util.Text
编码路径,或使用您选择的其他验证/转义方法。