当前位置: 首页 > 知识库问答 >
问题:

Hibernate@过滤器不工作在儿童与FetchType。懒惰

慕容越泽
2023-03-14

我的问题是:当我对父实体(合同)执行查询时,在子实体(ContractHeader)上应用过滤器并使用FetchType。LAZY,LAZY规则应用正确,但当我尝试访问子列表(ContractHeader)时,过滤器不会应用于子对象,所有子对象都加载到列表中。有人能帮我回答这个问题吗?过滤器应与fetchtype一起使用。懒惰?

有人成功地实施了这样的事情吗?

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
html" target="_blank">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;
}    

在调用查询之前,我已经启用了过滤器:

一场enableFilter(“calculatedFilter”)。setParameter(“计算的”,“S”);一场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个答案

范侯林
2023-03-14

我发现了发生的事情,问题与我对@Transactional的注释位置有关。

问题解决了!

 类似资料:
  • 我有模型类别。它可能有父类别和子类别列表。我写这个问题是因为找不到实体和自己相关的情况。 我试图这样实现它: 我保存实体,如: 我希望看到这样的情况: 但是在子模型中,我有递归循环。如何防止它? 是的,我也使用了@JsonIgnore。但是我不确定这是不是一个好的做法。但是如果我有一个案例,当我需要一个类别时,我真的需要将它发送给父母的UI。@JsonIgnore可以产生这个吗?

  • 当我尝试使用时,我得到一个异常。下面是堆栈跟踪: 编辑二:

  • 在过去的三天里,我一直在与错误“跨源请求被阻止:相同的源策略不允许读取http://localhost:8080/demomongo/templateapp/login上的远程资源。”(原因:缺少CORS头'Access-Control-Allow-Origin')。

  • 这是怎么工作https://graph.microsoft.com/v1.0/me/onenote/notebooks?filter=tolower(名)eq'我的笔记本' 来自图形资源管理器的屏幕截图 当我尝试在C#中编写相同的代码时,我得到了以下错误代码:BadRequest消息:无效筛选子句内部错误:AdditionalData:日期:2020-09-02T20:01:24 我正在使用下面的

  • 我使用此解决方案来过滤我的。使用该解决方案,我能够在键入时获得结果。但是当我清除搜索小部件时,我没有得到完整的列表,而是得到了空的。 这就是我的结果。https://imgur.com/nwyetEd 这是我的 这是我的 这是我使用过滤器的< code >活动 有人能帮助我吗?