diff --git a/rsql-jpa/src/main/java/io/github/perplexhub/rsql/RSQLJPAPredicateConverter.java b/rsql-jpa/src/main/java/io/github/perplexhub/rsql/RSQLJPAPredicateConverter.java index 6b587f96..d1dc13ee 100644 --- a/rsql-jpa/src/main/java/io/github/perplexhub/rsql/RSQLJPAPredicateConverter.java +++ b/rsql-jpa/src/main/java/io/github/perplexhub/rsql/RSQLJPAPredicateConverter.java @@ -133,7 +133,7 @@ RSQLJPAContext findPropertyPath(String propertyPath, Path startRoot) { classMetadata = getManagedElementCollectionType(mappedProperty, classMetadata); String keyJoin = getKeyJoin(root, mappedProperty); log.debug("Create a element collection join between [{}] and [{}] using key [{}]", previousClass, classMetadata.getJavaType().getName(), keyJoin); - root = join(keyJoin, root, mappedProperty); + root = join(keyJoin, root, mappedProperty, joinHints.get(keyJoin)); } else { log.debug("Create property path for type [{}] property [{}]", classMetadata.getJavaType().getName(), mappedProperty); root = root.get(mappedProperty); diff --git a/rsql-jpa/src/test/java/io/github/perplexhub/rsql/RSQLJPASupportTest.java b/rsql-jpa/src/test/java/io/github/perplexhub/rsql/RSQLJPASupportTest.java index 59f8d21f..72bc1a81 100644 --- a/rsql-jpa/src/test/java/io/github/perplexhub/rsql/RSQLJPASupportTest.java +++ b/rsql-jpa/src/test/java/io/github/perplexhub/rsql/RSQLJPASupportTest.java @@ -183,6 +183,26 @@ public final void testElementCollection2() { assertThat(rsql, count, is(4l)); } + @Test + public final void testElementCollection1WithJoinHints() { + final Map joinHints = new HashMap(){{put("Company.tags", JoinType.LEFT);}}; + final String rsql = "tags!=tech,tags=na=''"; + final List companies = companyRepository.findAll(toSpecification(rsql, null, joinHints)); + final long count = companies.size(); + log.info("rsql: {} -> count: {}", rsql, count); + assertThat(rsql, count, is(4L)); + } + + @Test + public final void testElementCollection2WithJoinHints() { + final Map joinHints = new HashMap(){{put("Company.bigTags", JoinType.LEFT);}}; + final String rsql = "bigTags.tag!=tech,bigTags.tag=na=''"; + final List companies = companyRepository.findAll(toSpecification(rsql, null, joinHints)); + final long count = companies.size(); + log.info("rsql: {} -> count: {}", rsql, count); + assertThat(rsql, count, is(4L)); + } + @Test public final void testToComplexMultiValueMap() { String rsql = "sites.trunks.id==2,id=na=2,company.id=='2',id=na=3,name==''";