Моя проблема: когда я выполняю запрос к родительскому объекту (Contract), применяя фильтры к дочернему элементу (ContractHeader) и использую FetchType.LAZY, правило LAZY применяется правильно, но когда я пытаюсь получить доступ к списку дочерних элементов (ContractHeader ) фильтры не применяются к дочернему элементу, и все дочерние элементы загружаются в список. Может ли кто-нибудь помочь мне с этим вопросом? Фильтры должны работать с fetchtype.LAZY?
Кто-нибудь успешно реализовал что-то подобное?
Tks!
У меня есть следующие сущности:
@Entity
@Table(name = "contract")
@FilterDefs ({
@FilterDef(name = "calculatedFilter", parameters = {@ParamDef(name = "calculated", type = "java.lang.String" )}),
@FilterDef(name = "headerStatusFilter", parameters = {@ParamDef(name = "headerStatus", type = "java.lang.String" )})
})
public class Contract {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "contract_id")
private Long contractId;
@OneToMany(mappedBy="contract",fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, orphanRemoval=true)
@Filters( {
@Filter(name="calculatedFilter", condition="calculated = :calculated"),
@Filter(name="headerStatusFilter", condition="header_status = :headerStatus")
})
@JsonManagedReference
private List<ContractHeader> contractHeader;
}
@Entity
@Table(name = "contract_header")
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="contractHeaderId", resolver=EntityIdResolver.class, scope = ContractHeader.class)
@Data
public class ContractHeader implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "contract_header_id")
private Long contractHeaderId;
@Column(name = "branch")
private Integer branch;
@Column(name = "calculated")
private String calculated;
@Column(name = "header_status")
private String headerStatus;
@ManyToOne(optional=false)
@JoinColumn(name = "contract_id", updatable=false)
@JsonBackReference
private Contract contract;
}
и перед вызовом запроса я включил фильтры:
session.enableFilter ("CalcatedFilter"). setParameter ("рассчитано", "S"); session.enableFilter ("headerStatusFilter"). setParameter ("headerStatus", "A");
Запросы генерируют:
Перед доступом к дочернему элементу:
select
contract0_.contract_id as contract1_2_
from
contract contract0_
where
exists (
select
contracthe1_.contract_header_id
from
contract_header contracthe1_
where
contract0_.contract_id=contracthe1_.contract_id
and contracthe1_.calculated = ?
and contracthe1_.header_status = ?
)
При обращении к ребенку:
select
contracthe0_.contract_id as contrac28_6_0_,
contracthe0_.contract_header_id as contract1_6_0_,
contracthe0_.contract_header_id as contract1_6_1_,
contracthe0_.calculated as calculat5_6_1_,
contracthe0_.header_status as header_6_6_1_
from
contract_header contracthe0_
where
contracthe0_.contract_id=?