Выражение свойства JPA - соответствует всем дочерним элементам в OneToManyRelationship - PullRequest
0 голосов
/ 05 ноября 2019

Требование

У меня есть простая взаимосвязь OneToMany между двумя объектами. Я хочу использовать выражение свойства JPA, чтобы найти родительский объект с условием, которое соответствует всем дочерним объектам.

Родительский

@Entity
public class PcSigningStatus {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "signingStatus")
    private List<PcSigningProcessEvent> signingProcessEvents = new ArrayList<>();

Дочерний

@Entity
public class PcSigningProcessEvent {
    @Enumerated(EnumType.STRING)
    private ProcessEventType phase;

    @ManyToOne
    @JoinColumn(name = "SIGNING_STATUS_ID")
    private PcSigningStatus signingStatus;
}

Родительский репозиторий

public interface SigningStatusRepo extends CrudRepository<PcSigningStatus, Long> {
    PcSigningStatus[] findBySigningProcessEvents_PhaseNot(ProcessEventType phase);
}

Выпуск

Предположим, у меня есть только 1 родительский объект в базе данных с 2 дочерними объектами, содержащими различное значение phase . Приведенный выше запрос возвращает одного и того же родителя несколько раз в зависимости от количества дочерних элементов, для которых он не соответствует значению phase in. Мне нужна помощь в поиске способа возврата родительского объекта, только если phase присутствует не во всех дочерних объектах

Ответы [ 3 ]

0 голосов
/ 05 ноября 2019

Трудно понять ваш вопрос :) Но вы можете попробовать добавить отличительный флаг, используя Distinct, упомянутый в https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation

Отредактировано: или вы можете использовать Query что-то вроде

SELECT * FROM PcSigningProcessEvent WHERE PcSigningProcessEvent.id NOT IN (SELECT SIGNING_STATUS_ID FROM PcSigningProcessEvent WHERE phase = ?)
0 голосов
/ 05 ноября 2019

Так что я не нашел способа сделать это с помощью выражения свойства, и вместо этого мне пришлось использовать Native Query.

Soltution

    @Query(value = "SELECT ss.* FROM PARENT_TABLE ss\n" +
            "left join CHILD_TABLE spe\n" +
            "ON ss.ID= spe.SIGNING_STATUS_ID\n" +
            "and spe.phase IN ('Value1', 'Value2')\n" +
            "where spe.ID is null", nativeQuery = true)
    PARENT_ENTITY[] customQuery();

Это вернет все родительские объекты, чье свойство детей phase не имеет ни одного значения 'Value1'или 'Value2' или оба.

0 голосов
/ 05 ноября 2019

Может быть, вы должны использовать @Query для этого?

...