Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在hibernate中为OneToMany映射添加限制_Java_Hibernate_Hibernate Criteria - Fatal编程技术网

Java 如何在hibernate中为OneToMany映射添加限制

Java 如何在hibernate中为OneToMany映射添加限制,java,hibernate,hibernate-criteria,Java,Hibernate,Hibernate Criteria,我一直在用@OneToMany映射获取结果。下面是模型类 evaluation.java @Entity @FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantIdParam", type = "string")) @Filters(@Filter(name = "tenantFilter", condition = "tenant_id = :tenantIdParam"))

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

evaluation.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
    }
所以我的问题是我想加载状态为非活动的PropertyOwners。我试着用不同的方法编写标准,但没有得到确切的结果。它总是返回给我所有的财产所有者,不管他们的状态如何,即使我对状态添加了限制。这是我尝试的标准之一

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;
    }

请为我提供一个解决这个问题的适当方法。谢谢。

我终于找到了一种方法,可以从房主的身份中得到准确的结果。棘手的部分是在检索结果时,hibernate加载所有匹配的实体,而不考虑
createAlias
中的
限制,因为
JoinType.internal\u JOIN
。因此我将
JoinType.LEFT\u OUTER\u JOIN
添加到
createAlias
中,并在
createAlias
中删除
限制。我像往常一样设置
限制。现在它给出了与状态匹配的精确结果

这是修改后的方法

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;
    }

谢谢。

我遇到了同样的问题,您的解决方案解决了它。我不清楚为什么hibernate是这样工作的,为什么INNERJOIN(我假设是默认值)不工作。但多亏了你的帖子,我才让它工作起来。
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;
    }
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;
    }