Spring Data Repository без указания сущности - PullRequest
0 голосов
/ 26 марта 2020

С помощью Spring Data вы можете создать репозиторий для данной сущности:

@Repository
public interface MyRepo extends CrudRepository<MyEntity, Long> {...}

Но что если у вас много пользовательских запросов, не привязанных к определенной c сущности?

Ничто из нижеприведенного не работает:

@Repository
public interface MyRepo {...}
@Repository
public interface MyRepo extends CrudRepository {...}
@Component
public interface MyRepo extends Repository {...}

И так далее.

По сути, я хочу иметь возможность инкапсулировать некоторые @Query с вводимый класс или интерфейс.

1 Ответ

1 голос
/ 29 марта 2020

Вы можете использовать обобщенный c суперкласс сущности вместо конкретной сущности. Очень обычно иметь абстрактный суперкласс для объявления идентификаторов сущностей или других общих вещей.

@MappedSuperclass
public abstract class AbstractEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }   
}

Затем вы можете создать такой репозиторий и autowire там, где он вам нужен:

public interface MyRepo extends JpaRepository<AbstractEntity, Long> {

    @Query("...")
    myQueryMethod();
}

Тем не менее, интерфейсы Spring Data предназначены для работы с root сущностью. Я думаю, что если вы хотите избежать этого, вам следует использовать базовый уровень JPA (то есть использовать EntityManager для выполнения запросов вместо репозитория данных Spring).

...