Как указать javax.persistence @Entity аннотированные классы в дженериках? - PullRequest
0 голосов
/ 26 сентября 2018

Я хочу написать функции, которые действуют на классы, например, начиная с Spring JpaRepository<TestEntity, Integer>.

Я пытался: Entity:

import javax.persistence.Entity; 
import javax.persistence.Id;

@Entity
public class TestEntity {
    @Id
    Integer a;
    Integer b;
}

Repo:

import org.springframework.data.jpa.repository.JpaRepository;

public interface TestEntityRepository extends JpaRepository<TestEntity,Integer> {}

Класс обслуживания выглядит, например, так:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Service;

import javax.persistence.Entity;
import java.util.function.Function;

@Service
public class TestEntityService {

    @Autowired
    TestEntityRepository testEntityRepository;

    private Function<? extends JpaRepository<? extends Entity, Integer>, Boolean> doSomeThing = integerJpaRepository ->
        integerJpaRepository.findAll().isEmpty();

    public Boolean dbIsEmpty(){
        return doSomeThing.apply(testEntityRepository);
    }
}

Однако в Intellij возникает ошибка:

apply (capture <? Extends org.springframework.data.jpa.repository.JpaRepository <? extends javax.persistence.Entity, java.lang.Integer >>) в функции нельзя применить к (.java_tests.database.TestEntityRepository)

1 Ответ

0 голосов
/ 26 сентября 2018

Чтобы использовать Function<? extends JpaRepository<? extends Entity, Integer>, ваша TestEntity должна расширять или реализовывать сущность, а не быть аннотированной сущностью.

Общий подходсделать это - создать интерфейс (или абстрактный класс) и заставить TestEntity реализовать (или расширить) его.

public class BaseEntity { ... }

public class TestEntity extends BaseEntity { ... }

и метод

//---------------------------------------------------vvvvv-------
private Function<? extends JpaRepository<? extends BaseEntity, Integer>, Boolean> doSomeThing = integerJpaRepository ->
        integerJpaRepository.findAll().isEmpty();
...