Hibernate @Filter 在 Child 和 FetchType.LAZY 上不工作

Hibernate @Filter not working on Child with FetchType.LAZY

我的问题是:当我在 parent 实体(合同)上执行查询时,在 child(ContractHeader)上应用过滤器并使用 FetchType.LAZY,正确应用了 LAZY 规则,但是当我尝试访问 child (ContractHeader) 的列表时,过滤器未应用于 child 并且所有 children 都加载到列表中。 谁能帮我解决这个问题? 过滤器应与 fetchtype.LAZY ?

一起使用

有没有人成功实施过类似的东西?

谢谢!

我有以下实体:

@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("calculatedFilter").setParameter("calculated", "S"); session.enableFilter("headerStatusFilter").setParameter("headerStatus", "A");

查询生成:

访问 child 之前:

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 = ?

        )

访问child时:

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=?

我发现发生了什么,问题与我注释@Transactional 的位置有关。

问题已解决!