From 17d255830b3ae4da52be92113944ee9e9d277e14 Mon Sep 17 00:00:00 2001 From: P63098 Date: Sat, 5 Apr 2025 12:51:13 +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 bf32c6b..9dcb921 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 @@ -144,7 +144,7 @@ private RSQLJPAContext findPropertyPathInternal(String propertyPath, Path startR 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 if (JsonbSupport.isJsonType(mappedProperty, classMetadata)) { root = root.get(mappedProperty); attribute = RSQLVisitorBase.getAttribute(mappedProperty, classMetadata); 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 6d08712..45c4476 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 @@ -278,6 +278,26 @@ final void testElementCollection2() { assertThat(rsql, count, is(4L)); } + @Test + final void testElementCollection1WithJoinHints() { + final Map joinHints = Map.of("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 + final void testElementCollection2WithJoinHints() { + final Map joinHints = Map.of("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 final void testToComplexMultiValueMap() { String rsql = "sites.trunks.id==2,id=na=2,company.id=='2',id=na=3,name==''";