Множество связей в гибернации

#sql #hibernate #jpa #spring-data-jpa #hql

#sql #переход в режим гибернации #jpa #spring-data-jpa #hql

Вопрос:

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

Значение параметра

значение параметра открытого класса расширяет 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<>(); }
 

параметр:

Параметр открытого класса расширяет 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( имя = константы.Таблица.СТАТУС, схема = Схема.RATES, UniqueConstraints = @UniqueConstraint( имя = константы.UniqueConstraint.STATUS_CODE, ColumnNames = Константы.Столбец.КОД ) ) @EqualsAndHashCode(callSuper = false) Статус открытого класса расширяет 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 = «активный», если у значений 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, у которого был статус параметра АКТИВНЫМ

Комментарии:

1. Ваши таблицы не имеют значения. Важны ваши сущности, потому что JPQL работает с сущностями, а не с таблицами. Опубликуйте код ваших объектов, объясните, что должен делать запрос и что он делает вместо этого.

2. Я только что отредактировал полный код

3. Нигде нет свойства status. И вы все еще не объяснили точно, что вы ожидаете от этого запроса и что он делает вместо этого.

4. Когда я выполняю запрос, HQL автоматически подключает его к объекту состояния и выполняет реализацию. Проблем с получением статуса объектов нет. Я объяснил свою проблему, добавил объект статуса и отредактировал свой вопрос) Спасибо

5. Для меня это очень важно, я новичок в этом, и теперь у меня был сложный запрос на hql, потеря