【问题标题】:Hibernate @Filter not working on Child with FetchType.LAZYHibernate @Filter 无法使用 FetchType.LAZY 处理 Child
【发布时间】:2020-06-17 18:06:53
【问题描述】:

我的问题是:当我对父实体(合同)执行查询时,对子实体(ContractHeader)应用过滤器并使用 FetchType.LAZY,正确应用 LAZY 规则,但是当我尝试访问子实体(ContractHeader)列表时) 过滤器不适用于子级,所有子级都加载到列表中。 谁能帮我解决这个问题? 过滤器应该与 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");

查询生成:

在访问孩子之前:

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

【问题讨论】:

  • 你用的是什么休眠版本?
  • 嗨,我正在使用 Hibernate Core {5.3.10.Final} Tks !

标签: hibernate jpa filter entity lazy-evaluation


【解决方案1】:

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

问题解决了!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    相关资源
    最近更新 更多