From 29b8252cec25b2730ef798a195019fbd43ac713e Mon Sep 17 00:00:00 2001 From: P63098 Date: Fri, 4 Apr 2025 02:51:30 +0200 Subject: [PATCH] Fix 176 Add the ability to choose the join type with ElementCollection --- .../rsql/RSQLJPAPredicateConverter.java | 2 +- .../perplexhub/rsql/RSQLJPASupportTest.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) 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==''";