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

AEM查询生成器:搜索多个属性

徐新荣
2023-03-14

如何在给定节点下列出多个属性的所有属性和各自的值。

例如,在下面的代码中,我只能搜索一个属性。但我需要搜索10个不同的属性(alttext、img、promos等),并获得相应的值(如果存在)。

 Map<String, String> map = new HashMap<String, String>();
                    map.put(TYPE_PREDICATE, "nt:base");
                    map.put(PATH_PREDICATE, printAttachmentJsonNodePath);
                    map.put("property", "fileReference");
                    map.put("p.excerpt", "true");
                    map.put(SEARCH_LIMIT_PREDICATE, "-1");

                    Query query = queryBuilder.createQuery(PredicateGroup.create(map),
                            resourceResolver.adaptTo(Session.class));
                    SearchResult result = query.getResult();

                    for (Hit hit : result.getHits()) {
                        String path = hit.getPath();
                        Resource resourceHit = resourceResolver.getResource(path);

                            Node node = resourceHit.adaptTo(Node.class);


                            String fileReference = node.getProperty("fileReference").getString();
                            System.out.println(fileReference);
                    }

共有2个答案

越俊驰
2023-03-14

如果您有很多属性,或者在运行时生成了大量属性,则可以使用谓词。班

您的代码

Map<String, String> map = new HashMap<String, String>();
map.put(TYPE_PREDICATE, "nt:base");
map.put(PATH_PREDICATE, printAttachmentJsonNodePath);
map.put("property", "fileReference");
map.put("p.excerpt", "true");
map.put(SEARCH_LIMIT_PREDICATE, "-1");

Query query = queryBuilder.createQuery(PredicateGroup.create(map),
        resourceResolver.adaptTo(Session.class));
SearchResult result = query.getResult();

威尔看起来是这样的:

PredicateGroup rootGroup = new PredicateGroup();
rootGroup.add(new Predicate("type").set("type", "nt:base"));
rootGroup.add(new Predicate("path").set("path", printAttachmentJsonNodePath));
rootGroup.add(new Predicate("property").set(property, "fileReference"));
rootGroup.add(new Predicate("property").set(property, "property1").set("value", value1));
.....
rootGroup.add(new Predicate("property").set(property, "propertyN").set("value", valueN));
rootGroup.set(Predicate.PARAM_EXCERPT, Boolean.TRUE.toString());
rootGroup.set(Predicate.PARAM_LIMIT, "-1");

Query query = queryBuilder.createQuery(rootGroup);
query.setHitsPerPage(limit); // also you could put limit here

SearchResult result = query.getResult();
...........

在这种情况下,将在以下属性之间创建条件:@property1=value1和@property2=value2

如果您想要OR,请创建单独的组并将其添加到根组:

PredicateGroup properties = new PredicateGroup();
properties.add(new Predicate("property").set(property, "property1").set("value", value1));
.....
properties.add(new Predicate("property").set(property, "propertyN").set("value", valueN));
properties.setAllRequired(false);

rootGroup.add(properties);
贺英悟
2023-03-14

可以为多个属性使用数字前缀:

map.put("1_property", "jcr:content/cq:template");
map.put("1_property.value", "/apps/geometrixx/templates/homepage");
map.put("2_property", "jcr:content/jcr:title");
map.put("2_property.value", "English");

这是文件

 类似资料:
  • 我需要在AEM查询生成器中进行搜索,只获取尚未移动到新位置的标签。 添加到旧标签的唯一属性是"",它具有新位置的路径。 但是当我试图搜索没有这个属性的标签时,我没有得到任何结果: 我错过什么了吗?搜索由第三方完成,无法处理其收到的标签列表。所以我只需要通过这个查询获取正确的列表。

  • 我正在构建一个简单的元数据表,从查询中获取数据。我希望能够查询“type”变量的两个选项。然而| |不起作用;当我使用这个时,页面崩溃。

  • 我需要创建一个查询,其中参数如下: 但是,我需要排除这个总括文件夹中的某个路径,比如:,然后在所有其他文件夹中搜索(其数量不断变化) 有没有办法做到这一点?我没有在网上找到它。 我还尝试了操作,因为父路径被保存在JCR属性中,但仍然没有运气。我实际上需要来避免路径的所有出现。但是没有这样的事情:

  • 如何在下面的查询生成器代码段中获得industries page属性有值的结果?(即,其值不是空字符串)

  • 我需要使用AEM查询生成器检索父节点。 例如,这是我的问题: 此查询允许我检索以下元素: 使用此查询,可以检索放置在 /content/test/us/bar下的所有元素,这些元素包含8003170008212作为产品属性的值。 从前面的项目符号开始,我只需要返回父节点,例如: 我可以通过编程实现我的目标,迭代结果并使用3次getParent()方法。 我想知道:有没有一种方法可以通过查询生成器获

  • 我有以下工作查询 它在整个路径=/content/dam上运行,所以它遍历所有节点大约20分钟,并给出结果。 当以编程方式使用查询生成器api时,我如何才能批量使用它,比如-遍历1000个节点并按代码执行某些操作,然后继续查询并遍历下1000个节点等等?这可能吗? 谢谢。