UPDATE: I have checked this page and it does not seem to be the same problem. SO's auto-closer mistakenly thought they're the same. This talks about a specific error that I am having.
I am trying to create a custom Spring Data JPA repository that adds custom behavior to all repositories. I've followed all the instructions I could find for this, but I still keep coming up with
"PropertyReferenceException: No property 'advancedSearch' found for type 'X'"
from my pom:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
<relativePath />
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Here's my code. JpqlQuery is a class I wrote. This is my interface.
@NoRepositoryBean
public interface QueryRepository<T, ID extends Serializable> extends JpaRepository<T, ID>
{
QueryResults<T> advancedSearch(JpqlQuery<T> query) throws Exception;
}
I will be creating sub-interfaces extending that interface like so:
public interface AddressRepository extends QueryRepository<Address,Long>
{
}
This is the implementation. Note that it is the name of the interface plus "Impl" which I have read is necessary. I've tried putting this in a sub-package of the interface and also the same package as the interface, but it made no difference.
public class QueryRepositoryImpl<T, ID extends Serializable> extends SimpleJpaRepository<T, ID>
implements QueryRepository<T, ID>
{
@PersistenceContext
private final EntityManager em;
public QueryRepositoryImpl(Class<T> domainClass, EntityManager em)
{
super(domainClass, em);
this.em = em;
}
public QueryRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager em)
{
super(entityInformation, em);
this.em = em;
}
@Override
@Transactional
public QueryResults<T> advancedSearch(
JpqlQuery<T> query) throws Exception
{
...
}
}
I also added the package name for the implementation to a ComponentScan annotation on the main application class:
@EnableEurekaClient
@SpringBootApplication
@ComponentScan({ //
"com.mycompany.common.repositories.impl" // For QueryRepositoryImpl
})
public class CoreRestServiceApplication
{
...
}
and added the following to a Configuration class in a service.
@Configuration
@EnableJpaRepositories(//
basePackages = {"com.mycompany.common.repositories.impl"}, //
repositoryBaseClass = QueryRepositoryImpl.class) // takes the place of the QueryRepositoryFactoryBean
public class ApplicationConfiguration
{
...
}
The QueryRepository and QueryRepositoryImpl classes are in one jar and the services that use it are in different jars/projects. Could this be the error?
What am I missing or doing wrong?