#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, потеря