Generic JPA repository for multiple entities

14,117

You can use entity inheritance and use Spring Expression Language (SpEL) to make repository issue calls on right entities. Like in my last update here

Share:
14,117
Tobi
Author by

Tobi

Updated on June 29, 2022

Comments

  • Tobi
    Tobi almost 2 years

    I have several entities and use Spring Data JPA repositories with specifications query my database. Therefore I created a generic class SpecBuilder to build my queries based on a query description (MyQueryDescriptor).

    public class Specs {
      public static <T extends MyEntityIFace> Specification<T> myfind(final MyQueryDescriptor qDesc) {
        return new Specification<T>() {
          @Override
          public Predicate toPredicate(Root<T> root, 
                   CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
            try {
              return SpecBuilder.mySpec(root, criteriaQuery, criteriaBuilder, qDesc);
            } catch (Exception e) {
              ...handle error...
            }
          }
        };
      }
    }
    

    My repositories:

    public interface Entity1DAO extends Repository<Entity1,Long>, 
                                        JpaSpecificationExecutor {
    }
    

    and

    public interface Entity2DAO extends Repository<Entity2,Long>, 
                                        JpaSpecificationExecutor {
    }
    

    Now there are 3 things I am not quite sure about:
    1)
    Is this use of a generic SpecBuilder a clean design?

    2)
    Is there a way to avoid writing those repository interfaces for each entity? Let's say a generic repository?

    3)
    The MyQueryDescriptor class has a method to return an instance of an Entity, which will be queried.
    What would be a clean way to obtain the according repository based on the entity class, avoiding a switch case? I was thinking about putting an annotation with the specific repository class to each entity but it feels a bit smelly.
    Should I create a factory and inject a map like

    Entity1.class => Entity1DAO
    Entity2.class => Entity2DAO
    

    ?

  • crizzis
    crizzis about 3 years
    How exactly does this help with JpaSpecificationExecutor?