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

Spring Data JPA/Hibernate:如何在同一个表中使用JOIN列时避免不必要的JOIN

西门庆
2023-03-14

让我们假设以下关联:

 @JoinColumn(
        name = "contract_id", nullable = false,
        foreignKey = ForeignKey(name = "fk_example__contract"),
 )
 val contract: Contract,
fun findAllByContractId(contractId: Long, pageable: Pageable): Page<ExampleProjection>
//avoiding join to contract, if just using ```contract_id``` in where clause
@Column(name = "contract_id", insertable = false, updatable = false)
var contractId: Long? = null 

添加此附加映射后,使用FindAllByContractID时,到表合同的左外部联接将消失

这个解决方案在我的测试用例中有一个缺点:在用repsitory.getOne(id)(Spring Data JPA)加载实体后,实体示例中的contractid属性为null。

如果我只需要使用带有contractid的投影,或者如果我只想在where子句中使用它,如果contract_id在同一个表example中,有没有更好的方法避免联接?

共有1个答案

鲜于阳成
2023-03-14

您如何定义它的列应该工作得很好。

也许是如何用repository.getOne()加载数据的问题。你在测试中用它吗?也许您需要调用TestEntityManager.clear(),以便Hibernate能够正确地将id列映射到您的实体属性

 类似资料:
  • 本文向大家介绍在React中如何避免不必要的render?相关面试题,主要包含被问及在React中如何避免不必要的render?时的应答技巧和注意事项,需要的朋友参考一下 shouldComponentUpdate、memoization、PureComponent

  • 我使用的是一个包含DATETIME列的SQLite数据库。jOOQ default将日期时间列绑定到java。sql。时间戳。查询包含DATETIME列的表会导致每列出现NumberFormatException(已处理)。 我使用jOOQ 3.11.9。 异常在parse方法,当它第一次尝试将时间戳字符串值转换为数字时。 查看和DefaultTimestampBinding方法时,时间戳总是ge

  • 我有一个从XML映射的类。为了简单起见,让我们想象这个类是这样的: 现在,现有的代码中充满了像这样的方法: …等等。你肯定有这个想法。 我需要包含一个新的方法来从employee返回一个新的属性,但是由于我觉得这对mantain来说是可怕的,所以我拒绝在那里添加一个新的方法。我正在考虑使用action模式,以某种方式避免至少重复againg和for循环,但我不得不说,我找不到一个聪明的解决方案。

  • 问题内容: 我有按日期排序的旅行数据(大集合)列表。 现有行为 我将所有行程数据存储到SqlLite Db中。对于添加的每个新数据,我通常都会收到fcm通知,并且使用上次更新的时间概念仅同步新添加的数据。这样,当cx打开应用程序时,他将始终从我的数据库中读取数据,从而节省了 读取 和 网络 操作。 如何使用Firestore达到相同的目的? 需要考虑的几个问题: Firestore get()始终

  • 我问的问题非常简单,但似乎不可能找到答案。我正在使用Spring Data JPA,我有一个JDBC/JPA(这是PostgreSQL,但这不重要),它预加载了数据,我只是试图从中读取。 我如何构造我的POJO,这样我就可以有一个< code >列表 这样做,我得到了一个 在另一个表中?我如何修复这种行为?我只是尝试将PostgreSQL 列映射回< code >列表

  • 我一直在尝试HQL和Criteria的不同组合,但我无法避免一些不必要的连接(在两者中)和一些不必要选择(在Criteria中)。 在我们的场景中,我们在Segment和Application实体之间有@ManyTo的关系(导航是从Segment到应用程序)。 首先我尝试了这个标准: Wich 生成此 SQL: 正如您所看到的,Criteria从APPLICATION中选择列,我不想被选择。我还没