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

Hibernate hql Internal join Eanger fetch对一对多进行抓取,获取冗余的父对象

祁柏
2023-03-14

我有如下实体

课程进展

@Entity
public class ProgressNote implements Serializable{

    @Id
    private NotesKey notesKey = new NotesKey();

    private Set<PatientObjective> patientObjectives;

    public NotesKey getNotesKey() {
        return notesKey;
    }
    public void setNotesKey(NotesKey notesKey) {
        this.notesKey = notesKey;
    }


    @OneToMany(fetch=FetchType.LAZY)
    @Access(AccessType.PROPERTY)
    @JoinColumns({
        @JoinColumn(name="noteNumber",referencedColumnName="noteNumber"),
        @JoinColumn(name="ddate",referencedColumnName="ddate"),
        @JoinColumn(name="patient_id",referencedColumnName="patient_id")
    })
    public Set<PatientObjective> getPatientObjectives() {
        return patientObjectives;
    }
    public void setPatientObjectives(Set<PatientObjective> patientObjectives) {
        this.patientObjectives = patientObjectives;
    }


}

课堂笔记

@Embeddable
public class NotesKey implements Serializable{

    private Byte noteNumber;

    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name="ddate")
    private Date noteDate;

    private Patient patient;

    public Byte getNoteNumber() {
        return noteNumber;
    }

    public void setNoteNumber(Byte noteNumber) {
        this.noteNumber = noteNumber;
    }

    public Date getNoteDate() {
        return noteDate;
    }

    public void setNoteDate(Date noteDate) {
        this.noteDate = noteDate;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @Access(AccessType.PROPERTY)
    public Patient getPatient() {
        return patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }

    @Override
    public int hashCode() {
        ........
    }

    @Override
    public boolean equals(Object obj) {
        ........
    }

}

目标类

@Entity
public class PatientObjective implements Serializable{

    @Id
    private PatientObjectiveKey patientObjectiveKey;


    public PatientObjectiveKey getPatientObjectiveKey() {
        return patientObjectiveKey;
    }
    public void setPatientObjectiveKey(PatientObjectiveKey patientObjectiveKey) {
        this.patientObjectiveKey = patientObjectiveKey;
    }

}

类PatientObjectiveKey

@Embeddable
public class PatientObjectiveKey implements Serializable{

    private Objective objective;

    private Byte noteNumber;

    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(name="ddate")
    private Date noteDate;

    private Patient patient;

    @ManyToOne(fetch=FetchType.LAZY)
    @Access(AccessType.PROPERTY)
    public Objective getObjective() {
        return objective;
    }

    public void setObjective(Objective objective) {
        this.objective = objective;
    }

    public Byte getNoteNumber() {
        return noteNumber;
    }

    public void setNoteNumber(Byte noteNumber) {
        this.noteNumber = noteNumber;
    }

    public Date getNoteDate() {
        return noteDate;
    }

    public void setNoteDate(Date noteDate) {
        this.noteDate = noteDate;
    }

    @ManyToOne(fetch=FetchType.LAZY)
    @Access(AccessType.PROPERTY)
    public Patient getPatient() {
        return patient;
    }

    public void setPatient(Patient patient) {
        this.patient = patient;
    }

    @Override
    public int hashCode() {
        .......
    }

    @Override
    public boolean equals(Object obj) {
        ........
    }

}

在我使用这个命名查询之后

@namedQuery(name="findAllProgressNoteAnd Objals", query="from ProgressNote p内连接获取p.patientObjals as o其中p.notesKey.patient.id=: ResidentId)")使用SpringHibernate模板findByNamedQueryAndNamedParam

在表I中有两个ProgressNote,一个只有一个目标,另一个有17个目标。我在Java中得到如下结果。

查询生成为

select progressno0_.ddate as ddate46_0_, progressno0_.noteNumber as noteNumber46_0_, progressno0_.patient_id as patient17_46_0_, patientobj1_.ddate as ddate36_1_, patientobj1_.noteNumber as noteNumber36_1_, patientobj1_.objective_id as objective5_36_1_, patientobj1_.patient_id as patient6_36_1_, progressno0_.assessment as assessment46_0_, progressno0_.bloodPressure1 as bloodPre4_46_0_, progressno0_.bloodPressure2 as bloodPre5_46_0_, progressno0_.creationDate as creation6_46_0_, progressno0_.height as height46_0_, progressno0_.lastUpdatedDate as lastUpda8_46_0_, progressno0_.plans as plans46_0_, progressno0_.status as status46_0_, progressno0_.subject as subject46_0_, progressno0_.temprature as temprature46_0_, progressno0_.tempratureUnit as temprat13_46_0_, progressno0_.lastid as lastid46_0_, progressno0_.waist as waist46_0_, progressno0_.weight as weight46_0_, progressno0_.weightUnit as weightUnit46_0_, patientobj1_.remark as remark36_1_, patientobj1_.value as value36_1_, patientobj1_.ddate as ddate46_0__, patientobj1_.noteNumber as noteNumber46_0__, patientobj1_.patient_id as patient6_46_0__, patientobj1_.ddate as ddate0__, patientobj1_.noteNumber as noteNumber0__, patientobj1_.objective_id as objective5_0__, patientobj1_.patient_id as patient6_0__ from pnheader progressno0_ inner join pnobjremark patientobj1_ on progressno0_.ddate=patientobj1_.ddate and progressno0_.noteNumber=patientobj1_.noteNumber and progressno0_.patient_id=patientobj1_.patient_id where progressno0_.patient_id=? 

问题

我看到的问题是为什么我会得到ProgressNote的多个单一实例(id=152)。有没有办法避免这种重复?

如果有人向我解释或指出正确的方向,我将不胜感激。

使用Hibernate 3.6、Mysql 5.6.10

共有1个答案

葛飞扬
2023-03-14

使用不同的:

select distinct p from ProgressNote p 
inner join fetch p.patientObjectives as o 
where p.notesKey.patient.id = :patientId)
 类似资料:
  • 问题内容: 我有以下(嵌套)对象: 接下来,我要做的就是像这样引用子对象: 现在,我想做的就是从变量中获取对对象的引用。就像是: 这可能吗? 问题答案: 否。无法知道它来自哪个对象。 而这两个只是有同一个对象的引用。 您也可以这样做: 您现在有三个引用,和,同一个对象。它们都不是特别的。

  • 我有三个表/实体: > 游戏 网站游戏 地点 我必须在教义2中写查询,这将使所有游戏(作为对象)可用于特定的网站(得到这个特定的网站作为对象)。唯一的关系(多对一)在表/实体SiteGame中,它包含列/对象: 游戏/游戏id 站点/站点id 通常,原始SQL看起来像(并且可以工作): 这是我在教义中尝试过的,但失败了: 错误:路径表达式无效。必须是StateFieldPathExpression

  • 我正在使用hibernate在car和person表之间进行一对一映射。但一个人可能有车,也可能没有车。现在,在使用hibernate标准从person表中获取记录时,我只想获取那些拥有汽车的人,即person表中存在相应汽车表条目的条目。如何使用hibernate标准/别名实现这一点? 下面是一段代码。请提供获取结果所需的条件或别名:

  • 问题内容: hibernate映射中的默认访存类型是什么? 探索之后我知道的是: 渴望 一对一。 对于一对多来说,这是 懒惰的 。 但是在Eclipse中对其进行测试后,它对所有人都非常渴望。 是否取决于我使用的是JPA还是Hibernate? 问题答案: 这取决于您使用的是JPA还是Hibernate。 根据JPA 2.0规范,默认值为: hibernate的时候,一切都是懒惰的 更新: 最新版

  • 当我对它进行降序排序时,它应该首先显示Parent3,因为它有一个Z。这是我当前的hql,它得到了1>2>3的错误结果: 如果没有distinct,尽管它选择了多个相同的父级,但它仍然很好。 我有一个模型设置如下: 编辑:在集合中按HQL顺序对其进行排序,尽管当双亲具有相同的children.name值时,它不会比较下一个可能的值。即。 如果Parent1有孩子abba,zeon Parent2有

  • 根据这篇文章,我正在尝试反序列化与JooQ的一对多关联(没有代码生成)。 这是我的目标课程。 我的JooQ查询如下: 方法无法按预期工作。生成的SQL语句如下所示: 翻译后的postgres查询没有正确替换的key属性,这会导致SQL异常。 PS:我正在使用JooQ 3.14.0和postgres 11.5