Запрос к базе данных с использованием значений дискриминатора - PullRequest
0 голосов
/ 17 мая 2019

Я использую стратегию наследования одной таблицы. Я хочу выполнить поиск в базе данных, отфильтровав его по типу дискриминатора. Как мне написать функцию в JPA для выполнения этой операции.

Обычный способ определения методов с использованием метода findBy... не дает результатов.

Вот мой родительский класс

@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
        name="Leave_Type",
        discriminatorType=DiscriminatorType.STRING
        )
public class LeaveQuota {
// the fields and the required methods
}

Вот две дочерние сущности

@Entity
@DiscriminatorValue("Annual")
public class AnnualLeave extends LeaveQuota {
// the fields and the required methods
}

@Entity
@DiscriminatorValue("Casual")
public class CasualLeave extends LeaveQuota {
// the fields and the required methods
}

Я хочу запросить базу данных, отфильтровывая годовые и случайные листья отдельно. Это означает, что при поиске ежегодных отпусков все записи в столбце дискриминатора со значением «ежегодный» должны быть найдены. Как я могу это реализовать. Заранее спасибо!

1 Ответ

1 голос
/ 17 мая 2019

Создайте репозиторий для AnnualLeave.java, а именно AnnualLeaveRepo.java и CausualLeave.java, как показано ниже:

AnnualLeaveRepo.java

@Repository
public interface AnnualLeaveRepo extends JpaRepository<AnnualLeave,Integer>   {

    @Query("from AnnualLeave")
    public List<AnnualLeave> getLeaves();

    //consider noOfLeave is member of AnnualLeave.java class
    public List<AnnualLeave> findByNoOfLeave(int noOfLeave); 

}

CausalLeaveRepo.java

@Repository
public interface CausalLeaveRepo extends JpaRepository<CausalLeave,Integer>   {

    @Query("from CausalLeave")
    public List<CausalLeave> getLeaves();
}

Теперь, когда вы используете findAll () или getLeaves () или findByNoOfLeave (int) методы или любой другой пользовательский абстрактный метод AnnualLeaveRepo класса, он будет автоматически фильтровать результат с Leave_Type = "Annual" .

аналогично, когда вы используете findAll () или getLeaves () методы или любой другой пользовательский абстрактный метод из CausalLeaveRepo class, он автоматически отфильтрует результат с помощью Leave_Type = "Causal" .

Вам не нужно явно фильтровать.

примечание Если у вас есть какие-либо свойства в вашем классе, имеющие отношения (@OneToMany и т. Д.) С сущностью LeaveQuota или ее унаследованными сущностями, не забудьте использовать аннотацию @JsonIgnore для этих свойств. В противном случае вы получите ошибку переполнения стека

...