Многие-многие отношения в Hibernate - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть такие домены:

ParameterValue

открытый класс ParameterValue расширяет StatefulEntity {

@Id
@GeneratedValue(generator = Constants.SequenceGenerator.PARAMETER_VALUE,
        strategy = GenerationType.SEQUENCE)
@SequenceGenerator(
        sequenceName = Constants.Sequence.PARAMETER_VALUE_SEQ,
        name = Constants.SequenceGenerator.PARAMETER_VALUE,
        allocationSize = 1
)
private Long id;

@Column
private BigDecimal rangeStart;

@Column
private BigDecimal rangeEnd;

@Column
private LocalDateTime timeStart;

@Column
private LocalDateTime timeEnd;

@Column
private String mdmDictCode;

@Column
private String mdmDictFieldId;

@Column
private String mdmDictFieldCode;

@Column
private String mdmValue;

@Column
private String textValue;

@Column
private BigDecimal numberValue;

@ManyToOne(fetch = FetchType.LAZY,
        cascade = {CascadeType.REFRESH, CascadeType.DETACH})
private Parameter parameter;

@JsonIgnore
@ManyToMany(mappedBy = "parameterValues")
private List<RateValue> rateValues = new ArrayList<>(); }

параметр:

открытый класс Параметр extends StatefulEntity {

@Id
@GeneratedValue(generator = Constants.SequenceGenerator.PARAMETER,
        strategy = GenerationType.SEQUENCE)
@SequenceGenerator(
        sequenceName = Constants.Sequence.PARAMETER_SEQ,
        name = Constants.SequenceGenerator.PARAMETER,
        allocationSize = 1
)
private Long id;

@Column
private String code;

@Column
private String description;

@Column
private String mdmDictId;

@Column
private String mdmDictFieldId;

@Column
private String mdmDictFieldCode;

@ManyToOne(fetch = FetchType.LAZY, optional = false,
        cascade = {CascadeType.DETACH, CascadeType.REFRESH})
private ParameterType parameterType;

@Column
private Boolean nullable;

@JsonIgnore
@OneToMany(mappedBy = "parameter")
private List<ParameterValue> parameterValues = new ArrayList<>();

@JsonIgnore
@ManyToMany(mappedBy = "parameters")
private List<Rate> rates = new ArrayList<>(); }

Rate_value

public class RateValue extends StatefulEntity{

    @Id
    @GeneratedValue(generator = Constants.SequenceGenerator.RATE_VALUE,
                    strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(
            sequenceName = Constants.Sequence.RATE_VALUE_SEQ,
            name = Constants.SequenceGenerator.RATE_VALUE,
            allocationSize = 1
    )
    private Long id;

    @JsonIgnore
    @JoinColumn(name = "rate_id")
    @ManyToOne(fetch = FetchType.LAZY, optional = false,
            cascade = {CascadeType.DETACH, CascadeType.REFRESH})
    private Rate rate;

    @Column
    private String currencyCode;

    @Column
    @NotNull
    private BigDecimal interestValue;

    @Column
    private Boolean isInterest = false;

    @Column
    private BigDecimal minValue;

    @Column
    private BigDecimal maxValue;

    @Column
    private Boolean isDefaultValue = false;

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "rate_rate_pack_link_id")
    private RateRatePackLink rateRatePackLink;

    // ссылка на параметры
    @ManyToMany(
            fetch = FetchType.LAZY,
            cascade = {CascadeType.REFRESH, CascadeType.DETACH}
    )
    @JoinTable(name = Constants.Table.RATE_PARAMETER_VALUE,
            schema = Schema.RATES,
            joinColumns = {
                    @JoinColumn(name = Constants.Column.RATE_VALUE_ID,
                            referencedColumnName = Constants.Column.ID)
            },
            inverseJoinColumns = {
                    @JoinColumn(name = Constants.Column.PARAMETER_VALUE_ID,
                            referencedColumnName = Constants.Column.ID)
            }
    )
    private List<ParameterValue> parameterValues = new ArrayList<>();

    @Column
    @NotNull
    private String branchValue;

}

Состояние

@ Data @Audited @Entity @Table ( name = Constants.Table.STATUS, schema = Schema.RATES, uniqueConstraints = @UniqueConstraint ( name = Constants.UniqueConstraint.STATUS_CODE, columnNames = Constants.Column.CODE )) @EqualsAndHashCode (callSuper = false) открытый класс Status extends GenericObject {

@Id
@GeneratedValue(generator = Constants.SequenceGenerator.STATUS,
                strategy = GenerationType.SEQUENCE)
@SequenceGenerator(
        sequenceName = Sequence.STATUS_SEQ,
        name = Constants.SequenceGenerator.STATUS,
        allocationSize = 1
)
private Long id;

@Column(nullable = false, unique = true)
protected String code;

@Column
protected String description; }

Я хочу выбрать все RateValues ​​без rateValue.parameterValue.parameter.status = "active", если у RateValues ​​нет activeparameters, запрос должен вернуть RateValues ​​без параметров.

  @Query(value = "FROM RateValue r "
            + "LEFT JOIN FETCH r.status "
            + "LEFT JOIN FETCH r.parameterValues v "
            + "LEFT JOIN FETCH v.parameter p "
            + "WHERE v.parameter.status.code= 'ACTIVE'",

В настоящее время этот запрос возвращает мне все RateValues, у которых были parameterValues ​​с параметром .status = ACTIVE.

Но мне нужны все RateValues ​​и parameterValues ​​этого rateValue, которые имели статус параметра ACTIVE

...