Hibernate @Filter не работает с Child с FetchType.LAZY - PullRequest
0 голосов
/ 17 июня 2020

Моя проблема: когда я выполняю запрос к родительскому объекту (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=?

1 Ответ

0 голосов
/ 23 июня 2020

Я выяснил, что происходит, проблема была связана с тем, где я аннотировал @Transactional.

Проблема решена!

...