当前位置: 首页 > 面试题库 >

Hibernate可选联接-需要以两种方式返回联接列值

平和雅
2023-03-14
问题内容

作为hibernate可选连接的后续内容

系统中许多现有查询都依赖EntityOne和EntityTwo之间的映射关系,并且更改此关系不是一个吸引人的选择,但是我现在需要开始存储和检索tbl_one.two_id联接表中不存在的值。顺便说一句,这可以与以下映射配合使用:

@Entity
@Table(name="tbl_one")
public class EntityOne
{
    ....
    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "two_id")
    private EntityTwo two;
    ....
}

..但是,在查询时,如果结果的值two_id在联接表中不存在,则该字段的two值为null,并且我无法告知其tbl_one.two_id实际值。我希望hibernateEntityTwo只在不存在关系的情况下创建一个虚拟对象并填充其id字段。

我也尝试了two_id在没有连接的情况下映射到另一个字段:

@Entity
@Table(name="tbl_one")
public class EntityOne
{
    ....
    @ManyToOne
    @NotFound(action = NotFoundAction.IGNORE)
    @JoinColumn(name = "two_id", insertable = false, updatable = false)
    private EntityTwo two;

    @Column(name = "two_id")
    private String twoId;
    ....
}

…但是two即使相应的记录存在,也永远不会填充该字段。

本质上tbl_one.two_idEntityTwo如果关系存在,或者tbl_one.two_id如果关系不存在,我需要某种方法来插入/更新值,并检索已连接的实体。

我希望能够在不为同一张表创建两个映射的情况下解决此问题。

谢谢。

编辑: 更多信息

public class EntityTwo
{
    ...
    @Id
    @Column(name = "site_id")
    private String id;
    ...
}

问题答案:

这应该工作:

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "two_id", insertable = false, updatable = false)
private EntityTwo two;

@Formula("two_id")
private String twoId;

Hibernate将两次选择two_id列:一次填充两个关系,一次填充twoId。不过,twoId属性是只读的。

您也可以执行相反的操作,但是这两个属性将变为只读:

@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinFormula("two_id")
private EntityTwo two;

@Column("two_id")
private String twoId;


 类似资料:
  • 工作在SQL服务器 我有三张桌子 [TESTDB]。[dbo]。[TestList]数据看起来像 [路由]。[dbo]。[WUList]数据看起来像 [路由]。[dbo]。[WUArea]数据看起来像 我已经能够将[TestList]加入到[UWARE]或[WUList]我需要的数据显示方式,但我无法以我需要的方式加入3个列表。 并不是每个TestID都出现在[WUList]或[WUArea] 如

  • 问题内容: 我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。 表设置如下: 图像表包含基本图像元数据,重要的是因果字段 Imagefile表每个图像包含多个条目,每种格式一个 标签表保存标签定义 Tag_map表将标签映射到图像 在我通常的试验和错误

  • 问题内容: 我们有下面的查询。使用LEFT OUTER联接需要9秒钟才能执行。将LEFT OUTER更改为LEFT INNER可以将执行时间减少到2秒,并且返回 相同 数量的行。由于正在处理dbo.Accepts表中相同数量的行,而不论联接类型如何,为什么外层要花3倍的时间? 问题答案: 返回相同行数的事实是事后事实,查询优化器无法预先知道Accepts中的每一行在Marker中都有匹配的行,可以

  • 我的数据库中有几个表: games表:有team1、team2等列。这两列都引用了另一个表Team表:与players表具有一对多关系。 玩家表:与技能表有一对一的参考。 作为团队实体中的实体,我收集了FetchType设置为LAZY的玩家。 我正在进行选择查询以获得许多游戏。无论设置为获取类型(懒惰或渴望),都需要相当长的时间才能获取游戏的所有实体,因为它会加载两个团队,并且从DB日志中可以看到

  • 问题内容: 考虑我们有两个表,和。是表中的外键,并且是表中的主键。 这两个SQL查询之间有什么区别? 与 问题答案: 除语法外,对于小片段,它们的工作原理完全相同。但是,如果有可能,请始终使用ANSI-JOIN编写新查询。 至于语义上,逗号用于在两个表之间生成CARTESIAN乘积,这意味着生成表A中的所有记录与表B中的所有记录的矩阵,因此具有4和6条记录的两个表分别生成24个记录。然后,使用WH

  • 问题内容: 我在MySQL中有以下查询: 该表有27行,但查询仅返回1行。基于 这个问题, 我认为可能是由于WHERE子句。该表具有字段id,属性,字段,值,其中是第三个表的外键(我不需要从中获取数据)。 有没有一种方法可以从第一个表中选择所有行,包括表#2中字段为23的值(如果没有字段23,则为NULL)? 问题答案: 当然。将WHERE条件移动到JOIN: