gpt4 book ai didi

java - 如何在 hibernate 中向 OneToMany 映射添加限制

转载 作者:行者123 更新时间:2023-12-01 13:42:34 26 4
gpt4 key购买 nike

我一直在使用 @OneToMany 映射获取结果。这是模型类。

评估.java

    @Entity
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantIdParam", type = "string"))
@Filters(@Filter(name = "tenantFilter", condition = "tenant_id = :tenantIdParam"))
@Table(name = "assessment")
public class Assessment extends Revenue implements Comparable<Assessment> {

//other attriutes

@ManyToOne(fetch = FetchType.LAZY)
@Cascade(value = CascadeType.ALL)
@JoinColumn(name = "property_id")
private Property propertyAssessment;
@Column(name = "tenant_id", nullable = false)
private String tenantId;

//getters and setters
}

属性.java

@Entity
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantIdParam", type = "string"))
@Filters(@Filter(name = "tenantFilter", condition = "tenant_id = :tenantIdParam"))
@Table(name = "property")
public class Property implements java.io.Serializable {

//other attributes

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mas_gnd_id")
private GramaNiladhariDivision gramaNiladhariDivision;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mas_so_id", nullable = true)
private SubOffice subOffice;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mas_ward_id", nullable = true)
private Ward ward;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mas_road_id", nullable = true)
private Road road;
@Column(name = "side_of_property")
private Character sideOfProperty;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "mas_pt_id", nullable = true)
private PropertyType propertyType;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "property_description")
private PropertyDescription propertyDescription;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "propertyAssessment")
@Cascade(value = CascadeType.ALL)
private List<Assessment> assessments = new ArrayList<Assessment>(0);
@OneToMany(fetch = FetchType.LAZY, mappedBy = "property")
@Cascade(value = CascadeType.ALL)
@LazyCollection(LazyCollectionOption.FALSE)
private List<PropertyOwner> propertyOwners = new ArrayList<PropertyOwner>(0);

//getters and setters
}

PropertyOwner.java

@Entity
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantIdParam", type = "string"))
@Filters(@Filter(name = "tenantFilter", condition = "tenant_id = :tenantIdParam"))
@Table(name = "property_owner")
public class PropertyOwner implements java.io.Serializable {

//other attributes

@OneToOne(fetch = FetchType.EAGER)
@Cascade(value = CascadeType.ALL)
@JoinColumn(name = "person_id")
private Person person;
@Column(name = "is_main")
private Boolean main;
@ManyToOne(fetch = FetchType.LAZY)
@Cascade(value = CascadeType.ALL)
@JoinColumn(name = "property_id")
private Property property = new Property();
@Column(name = "tenant_id", nullable = false, updatable = false)
private String tenantId;
@Column(name = "status", columnDefinition = "varchar(255) default 'active'")
private String status;

//getters and setters

}

所以我的问题是我想加载状态为 INACTIVE 的 PropertyOwners。我尝试以不同的方式编写标准,但无法得到确切的结果。即使我向状态添加了限制,它始终会返回所有 PropertyOwner,无论其状态如何。这是我尝试过的标准之一。

public Assessment getAssessmentById(Long assessmentId, Object tenantId) throws HibernateException {
Session session = getSession(tenantId);
Assessment result;
result = (Assessment) session
.createCriteria(Assessment.class)
.setFetchMode("propertyAssessment", FetchMode.JOIN)
.createAlias("propertyAssessment.propertyOwners", "propertyOwners", JoinType.INNER_JOIN,
Restrictions.ne("propertyOwners.status", ScandiumKeyBox.INACTIVE))
.setFetchMode("propertyAssessment.subOffice", FetchMode.JOIN)
.setFetchMode("propertyAssessment.ward", FetchMode.JOIN)
.setFetchMode("propertyAssessment.gramaNiladhariDivision", FetchMode.JOIN)
.setFetchMode("propertyAssessment.propertyDescription", FetchMode.JOIN)
.setFetchMode("propertyAssessment.propertyType", FetchMode.JOIN)
.setFetchMode("propertyAssessment.road", FetchMode.JOIN).setFetchMode("registerNumber", FetchMode.JOIN)
.setFetchMode("registerPageNumbers", FetchMode.JOIN).setFetchMode("elgActivity", FetchMode.JOIN)
.add(Restrictions.eq("id", assessmentId)).uniqueResult();
return result;
}

请为我提供一个正确的解决方案来解决这个问题。谢谢。

最佳答案

最后我找到了一种从 PropertyOwners 状态获得准确结果的方法。棘手的部分是,当检索结果时,由于 JoinType.INNER_JOIN,无论 createAlias 中的 Restrictions 是什么,hibernate 都会加载所有匹配的实体。因此,我将 JoinType.LEFT_OUTER_JOIN 放入 createAlias 中,并删除 createAlias 中的 Restrictions。我像平常一样设置了限制。现在它给出了与状态匹配的精确结果。

这是修改后的方法。

public Assessment getAssessmentById(Long assessmentId, Object tenantId) throws HibernateException {
Session session = getSession(tenantId);
Assessment result;
result = (Assessment) session
.createCriteria(Assessment.class)
.setFetchMode("propertyAssessment", FetchMode.JOIN)
.createAlias("propertyAssessment.propertyOwners", "propertyOwners", JoinType.LEFT_OUTER_JOIN)
.setFetchMode("propertyAssessment.subOffice", FetchMode.JOIN)
.setFetchMode("propertyAssessment.ward", FetchMode.JOIN)
.setFetchMode("propertyAssessment.gramaNiladhariDivision", FetchMode.JOIN)
.setFetchMode("propertyAssessment.propertyDescription", FetchMode.JOIN)
.setFetchMode("propertyAssessment.propertyType", FetchMode.JOIN)
.setFetchMode("propertyAssessment.road", FetchMode.JOIN).setFetchMode("registerNumber", FetchMode.JOIN)
.setFetchMode("registerPageNumbers", FetchMode.JOIN).setFetchMode("elgActivity", FetchMode.JOIN)
.add(Restrictions.eq("id", assessmentId))
.add(Restrictions.ne("propertyOwners.status", ScandiumKeyBox.INACTIVE))
.uniqueResult();
return result;
}

谢谢。

关于java - 如何在 hibernate 中向 OneToMany 映射添加限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20595284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com