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

Hibernate通过非主键获取左连接

衡玄裳
2023-03-14

以下实体:

@Table
class AA1 {
 @Id
 Long id;

 String a_number;

 Category category;

 @ManyToOne(fetch = FetchType.LAZY)
 @JoinColumn(name= 'a_number', referencedColumnName='a_number')
 @JoinColumn(name= 'category', referencedColumnName='category')
 BB1 bb1 

...other fields...
}

@Table
class BB1 {
 @Id
 String a_number;

 Category category;

 String value;
}

JPQL查询:

SELECT a FROM AA1 a LEFT JOIN a.bb1 b;

Hibernate生成正确的sql查询,但当它尝试收集数据时,它会进行额外的调用,例如:

SELECT b.a_number, b.category, b.value FROM BB1 b WHERE b.a_number = ? AND b.category = ?

我检查了查询返回null。如何避免此类数据库查询?

我的调查:据我所知,Hibernate创建key by(AA1.a_number和AA1.category)并尝试从上下文中检索实体。对于特定的行“left join”,查询返回空值,Hibernate按键询问上下文,而上下文返回空值,这将导致对数据库的调用。

共有1个答案

龚俭
2023-03-14

只要看看实体定义@manytone(fetch=FetchType.LAZY)就是原因。

您明确地告诉JPA只有在需要/访问BB1时才能获取它。因此,当第一次调用获取父实体时,BB1不会被加载。只有当您访问子对象时,才会触发JPA获取它。

如果将其更改为FetchType。这两个实体将在一次调用中被查询。

但要小心,这两种方法都有好处。在这里阅读更多关于它的信息:https://thorben-janssen.com/entity-mappings-introduction-jpa-fetchtypes/

 类似资料:
  • 问题内容: 我的代码如下: rs 总是返回时不是null ,有人对此有想法吗?谢谢。 问题答案: 元数据接口实现由驱动程序供应商实现。某些驱动程序和某些数据库可能不支持它。这是来自Javadoc的文本:一些DatabaseMetaData方法以ResultSet对象的形式返回信息列表。常规的ResultSet方法(例如getString和getInt)可用于从这些ResultSet对象检索数据。如

  • 你能帮我连接两个数据帧吗。 我有两个数据帧。 DF1: DF2: 我需要基于前两个数据帧创建一个数据帧,左连接两列。列index和val2在两个数据帧中具有相同的名称。df3的结果应该如下所示: 应该删除df1中不存在的df2中的索引,如果df1中的索引具有与df2中相同的val2,则应该将1添加到新的列val3中,否则:NaN。 非常感谢提前!

  • 问题内容: 给定一个表名,如何从plpgsql函数中提取主键列及其数据类型的列表? 问题答案: 上面的查询非常糟糕,因为它确实很慢。 我会推荐这个正式版本: http://wiki.postgresql.org/wiki/Retrieve_primary_key_columns 如果需要模式,查询如下

  • 问题内容: 我正在尝试获取在SQL Server中连接到的数据库的名称。我试着做: 但是,出现以下错误: 如何获得我连接的数据库的名称? 问题答案: 您可以: 使用创建一个本地SQL查询。您可以使用提取一行结果。 从中获取JDBC ,然后从数据库元数据中提取连接字符串。对于SQL Server,我相信您需要解析才能提取实际的数据库名称。 请注意,它已被弃用,您应该使用。

  • 我遇到了一个非常有趣的场景。我知道n+1问题和FetchType.Eager和FetchMode.join。我有一个家长实体学校,它有2@onetomany儿童实体ie学生和教师。我需要所有3个,所以使用fetchtype.eager和fetchmode.join。 学校实体 学生实体 教师实体 学校回购 如果我通过findById方法获取School对象,即表的主键。 生成的SQL是学校、学生和

  • 我刚开始冬眠并尝试使用标准。我一直在从2个表(即主外键在realtion中的表)中获取结果。 我有Carpooler和SourceToDestination细节DTO,现在基于用户搜索数据,我想填充Carpooler Object,其中包含SourceToDestination细节,但我没有得到它,不知道如何使用标准API。 通过以上标准API,我只得到了SourceToDestination细节