Is there a way to use Query Builder to find a multi-value property that does NOT containt a particular value?
For instance, we have a "language" property that is a multi-value String. Can Query Builder find a node where the language property does not contain 'en' (English)?
Solved! Go to Solution.
Hi,
You got confused between 'exists' and 'not'
property.operation :
“equals” for exact match (default),
“unequals” for unequality comparison,
“like” for using the jcr:like xpath function ,
“not” for no match ,
“exists” for existence match
Views
Replies
Total Likes
I have personally never written a query to exclude values like this. Check this for possible help -- Query Builder Predicate Reference
Views
Replies
Total Likes
In hoping to find an undocumented predicate feature, I experimented with using multiple "operation" properties for "property". For example:
property=language
property.value=en
property.1_operation=not
property.2_operation=like
This didn't seem to work.
Hi,
Try below
property=language
property.value=en
property.operation=not
E.g.
path=/content/AEM63App/fr
type=cq:Page
property=jcr:content/language
property.value=en
property.operation=not
Views
Replies
Total Likes
Arun - That seems to show nodes that don't have the "language" property at all. I believe that when "not" is used for "property.operation", the "property.value" predicate is ignored.
Views
Replies
Total Likes
Just tested Arun;s response - this compiles --
Just tested this - it compiles and works to query We Retail pages using QueryBuilder.
Map<String, String> map = new HashMap<String, String>();
//set QueryBuilder search criteria
map.put("type", "cq:Page");
map.put("path", "/content/we-retail");
map.put("property", "jcr:content/jcr:language");
map.put("property.value", "en_CA");
map.put("property.operation", "not");
Views
Replies
Total Likes
Hi,
You got confused between 'exists' and 'not'
property.operation :
“equals” for exact match (default),
“unequals” for unequality comparison,
“like” for using the jcr:like xpath function ,
“not” for no match ,
“exists” for existence match
Views
Replies
Total Likes
Nice response Arun!
Views
Replies
Total Likes
you can try with XPATH queries as well
/jcr:root/content/AEM63App/fr//element(*, cq:Page)
[
(not(jcr:like(jcr:content/@language, 'en')))
]
Views
Replies
Total Likes
Arun - Your XPath example helped me understand why we were getting different results.
Though I'm working on a solution that uses Query Builder via the Java API, I tested this through the Query Builder Debugger. When I put these parameters into the Debugger:
path=/content/dam/subfolder
type=nt:unstructured
property=language
property.value=en
property.operation=not
here is the XPath that it generates:
/jcr:root/content/dam/subfolder//element(*, nt:unstructured)
[
not(@language)
]
Notice that it ignored "property.value".
However, when I add the additional "jcr:like" from your XPath example above and run the modified XPath query in the CRX Query tool:
not(jcr:like(@language, 'en'))
it works as expected. While it still returns nodes without the "language" property, it also includes nodes that have the "language" property but do not have an "en" value.
I am assuming that the Query Builder Java API behaves the same, translating to the same XPath query (or SQL2 equivalent) underneath.
We are using AEM 6.1 SP2. Is it possible that Query Builder in this version behaves differently than in newer version?
Views
Replies
Total Likes
Hi EricES
Yes, It is not giving results as expected using QueryBuilder but with XPATH it does.
I would suggest you can go with SQL2 query instead of Query Builder.
The last XPATH query, I've shared which gives result when there is no language property or no 'en' value for language property.
If you want to check both conditions just put one more condition with AND.
/jcr:root/content/dam/subfolder//element(*, nt:unstructured)
[
@language and not(jcr:like(@language, 'en'))
]
Views
Replies
Total Likes
Thanks for your help, Arun!