Hibernate выборка подмножества сущностей - PullRequest
0 голосов
/ 06 ноября 2018

В проекте у меня есть 2 контроллера REST, один из которых предназначен для использования третьими лицами, а другой - внутренним персоналом. Оба контроллера возвращают одни и те же объекты, но третьи стороны получают отфильтрованное подмножество того, что видит внутренний персонал. Фильтрация выполняется на основе поля типа объекта.

Моя текущая реализация выглядит следующим образом

@Entity
@Table("TABLENAME")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorFormula("0")
@DiscriminatorValue("0")
public class Entity {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "EntitySeq")
    @SequenceGenerator(name = "EntitySeq", sequenceName = "ENTITY_SEQ", allocationSize = 20)
    private Long id;

    //@Column("ENTITY_TYPE")
    //private EntityType entityType; //EntityType is an enumerator
}

@Entity
@Table("TABLENAME")
@Where("ENTITY_TYPE in ('A', 'B', 'C')
@DiscriminatorValue("00")   //Found at /7229174/nasledovanie-v-odnoi-tablitse-bez-diskriminatora
public class LimitedEntity extends Entity {}

Репозиторий записывается следующим образом:

public interface EntityRepository<T extends Entity> extends PagingAndSortingRepository<T, long> {
    List<T> findAll();
    List<T> findAll(Date from, Date to, Pageable pageable);

}

Чтобы проверить все это, я написал следующий тест:

@RunWith(SpringRunner.class)
@DataJpaTest
@ActiveProfiles({"local", "h2db"})
public class EntityRepositoryTest {
    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private EntityRepository<Entity> entityEntityRepository;

    @Autowired
    private EntityRepository<LimitedEntity> limitedEntityEntityRepository;

    @Before
    public void setup() {
        //Insert a record in the database for each possible value of entityType
    }

    @Test
    public void vacatureTypeFilterTest() {
        Date from = new GregorianCalendar(2018, 11, 5).getTime();
        Date to = new GregorianCalendar(2018, 11, 6).getTime();

        Assertions.assertThat(entityEntityRepository.countAllVacatures(from , to)).isEqualTo(EntityType.values().length);
        Assertions.assertThat(limitedEntityEntityRepository.countAllVacatures(from , to)).isEqualTo(3);
    }
}

Как написано в тесте, я ожидал, что результаты будут 9 и 3 соответственно, но оказывается, что они оба 9.

Почему это не работает, как ожидалось? Каков / правильный способ глобальной фильтрации?

...