如何在QueryBuilder查询中添加“where not”

时间:2014-03-19 15:05:57

标签: cq5 query-builder

我想搜索整个内容树,但不是搜索在其基础上具有“请勿搜索”属性的特定发辫。

Query Builder API页面除了AND和OR之外没有引用任何内容。

是否可以从搜索中排除路径,还是只能显式包含路径?

前三行是“/ content AND / content / path / es”。我想要“/ content AND NOT(/ content / path / es)”

map.put("group.1_path", "/content");
map.put("group.2_path", "/content/path/es");
map.put("group.p.or","false");

我已经尝试了接下来的两个都是真和假,但它们没有效果。

map.put("group.2_path.p.not", "true");
map.put("group.2_path.not", "true");
map.put("group.2_path", "not('/content/path/es')");

我找不到任何提及“不”或“!”的其他名称的文档。可能会改为使用。

4 个答案:

答案 0 :(得分:3)

是的,这是可能的。但不完全是你尝试的方式。

您可以使用属性谓词评估程序排除具有某些属性的页面。

对于前。如果要在其jcr:content节点中排除具有“donotsearch”属性的页面,则可以使用属性操作查询它,因为存在

map.put("path", "/content/geometrixx/en/toolbar");
map.put("type", "cq:Page");
/* Relative path to the property to check for */
map.put("property", "jcr:content/donotsearch"); 
/* Operation to perform on the value of the prop, in this case existence check */
map.put("property.operation", "exists"); 
/* Value for the prop, false = not, by default it is true */
map.put("property.value", "false"); 

这将导致以下XPath查询

/jcr:root/content/geometrixx/en/toolbar//element(*, cq:Page)
[
not(jcr:content/@donotsearch) 
]

但是如果您想要为属性donotsearch排除具有特定值的页面,那么您可以更改上面的查询,如下所示

map.put("property", "jcr:content/donotsearch"); //the property to check for
map.put("property.operation", "equals"); // or unequals or like etc..
map.put("property.value", "/*the value of the property*/");

您可以参考docs找到很多关于查询的其他信息。

答案 1 :(得分:2)

我不确定您使用的是哪个版本的CQ(您链接到5.4文档),但在5.5及更高版本中,PredicateGroup类有一个setNegated方法来排除结果将匹配定义的组。

你不能对单个谓词设置否定,但没有什么可以阻止你创建一个只有你想要否定的谓词的组:

Predicate pathPredicate = new Predicate("path").set("path", "/content/path/es");
PredicateGroup doNotSearchGroup = new PredicateGroup();

doNotSearchGroup.setNegated(true);
doNotSearchGroup.add(pathPredicate);

Query query = queryBuilder.createQuery(doNotSearchGroup);

编辑:只是为了更新您的评论,您应该能够将PredicateGroup添加到另一个PredicateGroup(因为PredicateGroupPredicate的子类)。所以,一旦你有了被否定的群体,将它与路径搜索结合起来:

Predicate pathPredicate = new Predicate("path");
pathPredicate.set("path", "/content");

PredicateGroup combinedPredicate = new PredicateGroup();
combinedPredicate.add(pathPredicate);
combinedPredicate.add(doNotSearchGroup);

Query query - queryBuilder.createQuery(combinedPredicate);

答案 2 :(得分:1)

这是非常简单的实施。 使用

map.put("group.p.not",true)
map.put("group.1_path","/path1/where/you/donot/want/to/search")
map.put("group.2_path","/path2/where/you/donot/want/to/search")

答案 3 :(得分:0)

我遇到了同样的问题,虽然我无法完全解决问题,但我能够使用群组和不平等运营商提出解决方法。类似的东西:

path=/var/xxx

1_property=jcr:primaryType
1_property.value=rep:ACL
1_property.operation=unequals

2_property=jcr:primaryType
2_property.value=rep:GrantACE
2_property.operation=unequals

顺便说一下,map.put(" group.p.not",true)对我没用。

此链接包含许多有用信息:https://hashimkhan.in/2015/12/02/query-builder/