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

JPQL Left Join-如何在实体类中设置实体关系

董畅
2023-03-14

两个表格:

TABLE_1:
REC_ID
1
2
3
4

TABLE_2:
REC_ID REC_VAL
2      A
3      B

实体类(基本结构):

@Entity
@Table(name="TABLE_1")
public class Entity1 {
    @Id
    @Column(name="REC_ID")
    private String recId;

    //getters and setters
}

@Entity
@Table(name="TABLE_2")
public class Entity2 {
    @Id
    @Column(name="REC_ID")
    private String recId;

    @Column(name="REC_VAL")
    private String recVal;

    //getters and setters
}

SQL查询和结果:

SELECT T1.REC_ID, T2.REC_VAL FROM TABLE_1 T1 LEFT OUTER JOIN TABLE_2 T2 ON T1.REC_ID = T2.RED_ID

Result:
REC_ID REC_VAL
1      null
2      A
3      B
4      null

JPQL查询:

SELECT e1.recId, e2.recVal FROM Entity1 e1 LEFT JOIN e1.<an Entity2 field in Entity1*>

*我知道我在上面给定的结构中没有它,但我想知道如何正确操作。我该如何从“ManyToOne”、“OneToOne”等选项中进行选择。

如何修改实体类和JPQL查询以获得与SQL查询相同的结果?我一直在尝试各种各样的事情,但都不管用。它不允许我创建两个具有相同列名的字段,也不允许我将字符串定义为@JoinColumn。我几乎成功了,但生成的SQL查询包含对表2中不存在的REC\u ID\u REC\u ID列的引用。在google搜索了这么多之后,我找不到合适的指南(忽略了JPQL不支持在线连接条件!)

共有1个答案

海信鸥
2023-03-14

您需要在实体之间建立一个OneToOne关联。在拥有方,该关联必须用@MapsId注释。这是从Hibernate留档中获取的一个示例,它映射到您的用例:

@Entity
public class Body {
    @Id
    public Long getId() { return id; }

    @OneToOne(cascade = CascadeType.ALL)
    @MapsId
    public Heart getHeart() {
        return heart;
    }
    ...
}   

@Entity
public class Heart {
    @Id
    public Long getId() { ...}
}          

有了它后,您可以使用查询,例如

select b.foo, h.bar from Body b left join b.heart h where ...
 类似资料:
  • 我试图坚持两个实体,它们有一对一和多对一的关系。 我正在尝试将表单集合嵌入到表单中。 我有一个多对一相关的实体,每次我创建一个新的课程简历,它与Candidat列相关candidat_id_id为空。 除了数据可数据中的Candidat id之外,只有实体Curendar umVitae被成功创建和持久化。 简历表 id|titre|candidat_id_id|id_education cand

  • 如果我继续尝试持久化这个实体,我将得到中持久化。 做这件事的正确方法是什么。可能是我理解的不对。

  • 问题内容: 在我的特定情况下,我正在使用区分列策略。这意味着我的JPA实现(hibernate)创建带有特殊 DTYPE 列的 users 表。此列包含实体的类名称。例如,我的 用户 表可以具有 TrialUser* 和 PayingUser的 子类。这些类名称将在 DTYPE 列中,以便EntityManager从数据库加载实体时,它知道要实例化的类的类型。 *** __ 我尝试了两种转换实体类

  • 我有一个实体人物,由音乐家和政治家继承,还有一个存储库人物存储库。 我正在尝试使用PersonRepository.save(..)将所有三个实体保存到MongoDB的集合“Person”中但是Spring-Data-MongoDB将其保存到3个单独集合“Person”、“Musician”和“Politician”中。 Java代码: 在阅读了一些帖子之后,我不得不为存储库的所有三个实体将集合名

  • 问题内容: 我正在尝试将实体扩展为用于填充超类字段的非实体。问题是,当我尝试保存它时,Hibernate会抛出MappingException。这是因为即使我将ReportParser强制转换为Report,但运行时实例仍然是ReportParser,因此Hibernate抱怨它是一个未知的实体。 ReportParser仅用于填写字段。 尝试将其投射到报告中并保存 在转移到ORM之前,我已经使用

  • 我想创建一个与JHipster的用户实体有多对一关系的实体。 我使用JDL-Studio创建了以下实体和与用户的关系,它使用jhipster port-jdl作为. jh文件导入到我的微服务中: 在编译我的微服务时,我得到以下错误: 轮廓java:44:错误:找不到符号私人用户;符号:类用户位置:类配置文件 轮廓映射器。java:12:错误:找不到symbol@Mapper(componentMo