当前位置: 首页 > 知识库问答 >
问题:

JCR SQL2查询:IsDescendatNode参数的绑定

万英武
2023-03-14

我正在编写一个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"));

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

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.bind值("base",...)上引发异常:

“javax.jcr.query.InvalidQueryException:java.text.ParseException:query:从[cq:PageContent]中选择*,其中IsDescendatNode($base(*)和([sling:resourceType]=$resourceType);预期:)”

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

共有1个答案

阎弘
2023-03-14

据我所知,通过阅读JSR-283规范path中的isdescendatof不允许变量绑定。Jackrabbit文档中描述了相同的语法,其中包括可读性很强的铁路图。

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

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

  1. 路径参数的来源读取
  2. 使用org.jackrabbit.util.Text对路径进行编码,或者使用您选择的其他验证/转义方法。
  3. 将路径与查询的其余部分连接起来,并通过绑定其余的变量来准备它(如果路径无效,则不要)
 类似资料:
  • 我正在使用JdbcTemplate。queryForObject(字符串sql、RowMapper、RowMapper、Object…args)从Oracle获取一行,但继续获取EmptyResultDataAccessException结果大小不正确:应为1,实际为0。 我已经使用Oracle SQL Developer验证了我的SQL,它返回了1行,就像它应该返回的一样。 > 这一直失败。 这

  • 我的spring boot applications controller包含一个方法,如下所示,该方法具有可选的 我的问题是,当我用swagger-ui传递查询参数时,这些值不会绑定到可分页对象。我这么说的原因是它打印pageSize为20是否我传递值5作为查询参数。 请求URL:http://localhost:8080/api/markups?offset=2&pageNumber=1&pa

  • 问题内容: 现在,我需要使用以下结构来将多个参数绑定到mysqli查询中: 我使用以下代码计算出问号的数量,并将其插入查询中: 我的问题是,肯定有一种方法可以动态处理查询中尽可能多的输入。硬编码似乎是处理此问题的一种非常糟糕的方法。 我正在使用PHP版本5.4.10 问题答案: 不幸的是,默认情况下,bind_param()不接受数组而不是单独的变量。但是,自PHP 5.6起,将进行重大改进。 要

  • 查询创建工具及查询编辑器都支持在查询文本使用参数。你可以设置查询参数来在每次运行查询时添加变量值。参数应作为一个识别符以 $ 开头,[ ] 括住,例如 [$任何名]。 运行查询及 输入参数 对话框提供你输入想要搜索的数据。

  • 查询支持在查询文本内使用参数。你可以设置查询参数,于每次运行查询时添加变量值。参数是一个以 $ 开头以及用 [ ] 括住的标识符,例如:[$任何名]。 运行查询时,你可以在“输入参数”对话框输入你想要搜索的数据。如勾选“原始模式”选项,将不会在传递输入值到查询时添加引号。

  • 查询支持在查询文本内使用参数。你可以设置查询参数,于每次运行查询时添加变量值。参数是一个以 $ 开头以及用 [ ] 括住的标识符,例如:[$任何名]。 运行查询时,你可以在“输入参数”对话框输入你想要搜索的数据。如勾选“原始模式”选项,将不会在传递输入值到查询时添加引号。