diff --git a/rsql-common/src/main/java/io/github/perplexhub/rsql/RSQLVisitorBase.java b/rsql-common/src/main/java/io/github/perplexhub/rsql/RSQLVisitorBase.java index 2a06df1d..d8ec4dfc 100644 --- a/rsql-common/src/main/java/io/github/perplexhub/rsql/RSQLVisitorBase.java +++ b/rsql-common/src/main/java/io/github/perplexhub/rsql/RSQLVisitorBase.java @@ -15,6 +15,7 @@ import lombok.Getter; import org.hibernate.metamodel.model.domain.ManagedDomainType; +import org.hibernate.metamodel.model.domain.PersistentAttribute; import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.orm.jpa.vendor.Database; @@ -58,6 +59,10 @@ public static Database getDatabase(EntityManager entityManager) { // W/A found here: https://hibernate.atlassian.net/browse/HHH-18569 // breaking change on hibernate side: https://github.com/hibernate/hibernate-orm/pull/6924#discussion_r1250474422 if (classMetadata instanceof ManagedDomainType managedDomainType) { + PersistentAttribute attribute = managedDomainType.findAttribute( property ); + if ( attribute != null ) { + return attribute; + } return managedDomainType.findSubTypesAttribute(property); } return classMetadata.getAttribute(property); diff --git a/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/AdminProjectRepository.java b/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/AdminProjectRepository.java new file mode 100644 index 00000000..24f85d5f --- /dev/null +++ b/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/AdminProjectRepository.java @@ -0,0 +1,9 @@ +package io.github.perplexhub.rsql.repository.jpa; + +import io.github.perplexhub.rsql.model.AdminProject; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface AdminProjectRepository extends JpaRepository, JpaSpecificationExecutor { + +} diff --git a/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/ProjectRepository.java b/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/ProjectRepository.java new file mode 100644 index 00000000..cd65a2e7 --- /dev/null +++ b/rsql-common/src/test/java/io/github/perplexhub/rsql/repository/jpa/ProjectRepository.java @@ -0,0 +1,9 @@ +package io.github.perplexhub.rsql.repository.jpa; + +import io.github.perplexhub.rsql.model.Project; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; + +public interface ProjectRepository extends JpaRepository, JpaSpecificationExecutor { + +} 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 4c39ec19..6d08712e 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 @@ -18,10 +18,14 @@ import java.util.*; import io.github.perplexhub.rsql.custom.CustomType; +import io.github.perplexhub.rsql.model.Project; +import io.github.perplexhub.rsql.model.AdminProject; import io.github.perplexhub.rsql.model.account.AccountEntity; import io.github.perplexhub.rsql.model.account.AddressEntity; import io.github.perplexhub.rsql.model.account.AddressHistoryEntity; import io.github.perplexhub.rsql.repository.jpa.AccountRepository; +import io.github.perplexhub.rsql.repository.jpa.AdminProjectRepository; +import io.github.perplexhub.rsql.repository.jpa.ProjectRepository; import io.github.perplexhub.rsql.repository.jpa.custom.CustomTypeRepository; import io.github.perplexhub.rsql.custom.EntityWithCustomType; import jakarta.persistence.criteria.Expression; @@ -70,6 +74,12 @@ class RSQLJPASupportTest { @Autowired private CustomTypeRepository customTypeRepository; + @Autowired + private AdminProjectRepository adminProjectRepository; + + @Autowired + private ProjectRepository projectRepository; + @Autowired AccountRepository accountRepository; @@ -1441,6 +1451,18 @@ void testSearchWithReducedPathUsingRSQLMapping() { Assertions.assertThat(result).hasSize(1); } + @Test + void testSearchByParentAttribute() { + List result = adminProjectRepository.findAll(RSQLJPASupport.rsql("name=='someProjectName'")); + Assertions.assertThat(result).hasSize(1); + } + + @Test + void testSearchBySubtypeAttribute() { + List result = projectRepository.findAll(RSQLJPASupport.rsql("departmentName==someDepartmentName")); + Assertions.assertThat(result).hasSize(1); + } + @BeforeEach void setUp() { getPropertyWhitelist().clear();