0

I have a basic crud operations repository, all my repository interfaced extends from JpaRepository and a custom interface that has a generic findByName method.

Custom interface;

@NoRepositoryBean
public interface MappedTypeRepository<T extends BaseEntity> {

    @Modifying
    @Query(value = "delete from #{#entityName} u where u.id = ?1")
    int customDeleteById(Long id);

    @Query(value = "select t from #{#entityName} t where t.name = ?1")
    T findByName(String name);
}

The problem is, i'm using findByName method only on services that their entities have a "name" parameter.

Example entity;

@Entity
@Table(name = "project")
@Getter
@NoArgsConstructor
public class Project extends BaseEntity {

    @Column(name = "project_name")
    private String name;

    @Column(name = "firm_id")
    private Long firmId;

    @Temporal(TemporalType.DATE)
    @Column(name = "start_date")
    private Date startDate;

    @Temporal(TemporalType.DATE)
    @Column(name = "end_date")
    private Date endDate;
}

Example service;

@Service
@Qualifier("ProjectService")
public class ProjectService implements IBaseService<Project, PaginationRequestBean, ProjectGenericForm> {

    private final ProjectRepository repository;

    @Autowired
    public ProjectService(ProjectRepository repository) {
        this.repository = repository;
    }

    @Override
    public Page<Project> findAll(PaginationRequestBean paginationRequestBean) {
        Pageable pageable = PageRequest.of(paginationRequestBean.getPage(), paginationRequestBean.getSize(), Sort.by(paginationRequestBean.getSort()));
        return repository.findAll(pageable);
    }

    @Override
    public Project findById(ProjectGenericForm projectGenericForm) {
        Optional<Project> project = repository.findById(projectGenericForm.getId());
        return project.orElseGet(Project::new);
    }

    @Override
    public Project findByName(ProjectGenericForm projectGenericForm) {  //HERE IS THE METHOD
        return repository.findByName(projectGenericForm.getName());
    }

    @Override
    public Project save(Project project) {
        return repository.save(project);
    }

    @Override
    public Project update(Project project) {
        return repository.save(project);
    }

    @Override
    public int delete(Long id) {
        return repository.customDeleteById(id);
    }

}

Example repository;

@Repository
public interface ProjectRepository extends JpaRepository<Project, Long>, MappedTypeRepository<Project> {

}

As i said, some entities doesn't have a name parameter and im returning null on those service classes.

Example entity that doesn't have "name" parameter;

@Entity
@Table(name = "project_contacts")
@Getter
@NoArgsConstructor
public class ProjectContacts extends BaseEntity {

    @Column(name = "project_id")
    private Long projectId;

    @Column(name = "contact_user_id")
    private Long contactUserId;

    @Column(name = "contact_user_type")
    private Long contactTypeId;
}

Its example service;

@Service
@Qualifier("ProjectContactsService")
public class ProjectContactsService implements IBaseService<ProjectContacts, PaginationRequestBean, ProjectGenericForm> {

    private final ProjectContactsRepository repository;

    @Autowired
    public ProjectContactsService(ProjectContactsRepository repository) {
        this.repository = repository;
    }

    @Override
    public Page<ProjectContacts> findAll(PaginationRequestBean paginationRequestBean) {
        Pageable pageable = PageRequest.of(paginationRequestBean.getPage(), paginationRequestBean.getSize(), Sort.by(paginationRequestBean.getSort()));
        return repository.findAll(pageable);
    }

    @Override
    public ProjectContacts findById(ProjectGenericForm projectGenericForm) {
        Optional<ProjectContacts> projectContacts = repository.findById(projectGenericForm.getId());
        return projectContacts.orElseGet(ProjectContacts::new);
    }

    @Override
    public ProjectContacts findByName(ProjectGenericForm projectGenericForm) { //HERE IS THE METHOD
        return null;
    }

    @Override
    public ProjectContacts save(ProjectContacts projectContacts) {
        return repository.save(projectContacts);
    }

    @Override
    public ProjectContacts update(ProjectContacts projectContacts) {
        return repository.save(projectContacts);
    }

    @Override
    public int delete(Long id) {
        return repository.customDeleteById(id);
    }
}

Because of this, i'm getting this exception;

Caused by: org.hibernate.QueryException: could not resolve property: name of: com.kron.product.entity.ProjectContacts [select t from com.kron.product.entity.ProjectContacts t where t.name = ?1]
    at org.hibernate.QueryException.generateQueryException(QueryException.java:120) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.QueryException.wrapWithQueryString(QueryException.java:103) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:220) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:144) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:113) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:73) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:162) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.getQueryPlan(AbstractSharedSessionContract.java:636) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:748) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:114) ~[hibernate-core-jakarta-5.6.7.Final.jar:5.6.7.Final]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:360) ~[spring-orm-6.0.0-M3.jar:6.0.0-M3]
    at jdk.proxy2.$Proxy226.createQuery(Unknown Source) ~[?:?]
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.validateQuery(SimpleJpaQuery.java:90) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:66) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:53) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:154) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:239) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:83) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:102) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(QueryExecutorMethodInterceptor.java:94) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) ~[?:?]
    at java.util.Iterator.forEachRemaining(Iterator.java:133) ~[?:?]
    at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1061) ~[?:?]
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1845) ~[?:?]
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) ~[?:?]
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) ~[?:?]
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) ~[?:?]
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[?:?]
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) ~[?:?]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:96) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:86) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at java.util.Optional.map(Optional.java:260) ~[?:?]
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:86) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:355) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:278) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.util.Lazy.getNullable(Lazy.java:228) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.util.Lazy.get(Lazy.java:112) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:284) ~[spring-data-commons-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:132) ~[spring-data-jpa-3.0.0-M3.jar:3.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1787) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1736) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:603) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1372) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1292) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:863) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:767) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:227) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1329) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1187) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:565) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:525) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:326) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:324) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:200) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:254) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1372) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1292) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:863) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:767) ~[spring-beans-6.0.0-M3.jar:6.0.0-M3]
    ... 19 more
golgered
  • 1
  • 4
  • Does this answer your question? [Is it possible to add JPA annotation to superclass instance variables?](https://stackoverflow.com/questions/2883033/is-it-possible-to-add-jpa-annotation-to-superclass-instance-variables) – seenukarthi Nov 10 '22 at 10:05
  • Unfortunately, it didn't. I just want to learn the reason why it does execute the query method for every entity. – golgered Nov 10 '22 at 10:25

0 Answers0