【发布时间】: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