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

带多个选择但不带FetchType的即时抓取。即时注释

左丘季
2023-03-14

在某些用例中,我希望急切地获取一对多的列表-s(但并非总是如此,因此@OneToMany(fetch=FetchType.EAGER)将不太好),我还希望JPA使用单独的SQL选择来获取那些列表-s(每个列表一个选择,而不是每个列表项一个选择),而不是SQL连接。这是因为笛卡尔积(我有两个独立的列表)。

您可能认为我可以使用JPA2.1实体图(毕竟这就是它的用途,以一种特殊的方式将属性标记为急切的),或者使用JPQL(或使用criteria API)不太优雅地左连接fetch。但它们似乎坚持使用SQL join(在左连接获取的情况下,这并不奇怪),即使它们最终出现了多回退异常,它们也不会退回到在单独的SQL选择中获取一些列表-s。实际上,我的案例也是一个多包案例,但是在你引导我使用Set-s等工具之前,请注意前提是我不想要连接(太大的笛卡尔积)。现在,让我开个玩笑,如果我用@OneToMany(fetch=FetchType.EAGER)注释列表属性,Hibernate将足够聪明,可以在单独的选择中提取列表-s,以避免多个包(此外,我甚至可以使用Hibernate的fetch注释强制执行此行为)。因此,JPA 2.1实体图似乎无法实现ad-hocFetchType.EAGER的promise,因为它们的行为相当类似于ad-hoc fetch连接,我们在它们之前也已经有过这种连接。还是我遗漏了什么?

我突然想到,我应该在最初的查询之后调用父母ntity.get一些列表(). size(),这一次不会尝试急切地获取列表,但问题是,我也需要急切地获取列表的一些属性项本身,我不能为上述调用指定实体图。我也可以自己创建一个JPA查询,它只得到带有所说的急切读取的“某些列表”(这些没有问题),但是我如何把结果列表放回父母实体?如果我调用家长ntity.set一些列表(ftchedList)家长实体变得脏(尽管它不在关联的所有者端),因此它将SQLupdate-d(只是为了破坏上次修改时间和乐观锁定版本)。

共有1个答案

赵智勇
2023-03-14

另一种方法是在两个不同的实体中映射同一个表。因此,当您需要具有多个选择的EAGER行为时,您可以将该实体用于:

@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.EAGER)

当你想要懒惰的时候,你可以用另一个实体:

@Fetch(FetchMode.SELECT)
@ManyToOne(fetch = FetchType.LAZY)
 类似资料:
  • 我有以下实体: 我还有一个Spring数据JPA存储库,定义如下: 当我从存储库中执行find-method时,我想急切地加载TextRow。因此,我在上面的代码中引入了NamedEntityGraph-和EntityGraph-注释。 在数据库的文本表中有2个条目,在文本行表中各有3个条目。 我希望findAllByBelongsTo方法返回一个包含两个文本实例的列表。相反,它返回一个包含6个文

  • 问题内容: 我对CSS选择器有点困惑,我知道如果它们共享相似的属性,我们可以用逗号将多个css选择器分组,但是没有逗号的多个css选择器呢?例如: 问题答案: 当您使用逗号时,例如 你是说: id为menu的所有元素以及class为item的所有元素 当您将选择器嵌套而不使用逗号时,例如 你是说 在ID为menu的容器中具有class item的所有元素

  • 在运行我的程序后,我得到这个奇怪的崩溃发生大约2个小时运行它,说明它不能解析日期。 有没有人知道它为什么会给这个?因为当我在网上寻找,我发现它可能是由于一个不正确的格式,但由于我没有指定的格式这不是我的情况。 解析我的时间戳的代码如下: 注意:方法返回一个字符串,如: 更新#1:以下代码重复了此问题: 生成以下stacktrace

  • 我刚刚开始了解FetchType Lazy和Eager。我明白其中的区别,但即使我设置为Lazy,它仍然试图获取相关数据。 关系:1人:多部手机 查看的研究尝试和教程: https://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example-annotation/ http://howtodoinjava.com/hi

  • 问题内容: 我有以下数据: 我正在尝试编写一个查询,该查询选择与某个日期匹配的所有记录,但是我正在为该字段使用时间戳记,无论我如何尝试,我的查询都不会产生任何结果。 SQL :我尝试了以下查询,但没有任何结果 1。 2。 3。 仅当我将整个日期值设置为时,它才起作用; 问题答案: 尼古拉斯·克拉斯诺夫(Nicholas Krasnov)提供的答案

  • 问题内容: 在MySQL中使用RAND()从巨大的表中获取单个随机行非常慢: 这是有关此问题的文章,以及为什么会这样。 他们的解决方案是使用两个查询: 我想知道,是否只有一个查询就能做到这一点。 所以我的方法是: 但是它暗示MySQL在Limit内不允许任何逻辑。尽管我找不到有关此主题的任何信息,但这是否是正确的。 所以我的问题: 如何在LIMIT内使用RAND()? 您是否知道其他任何解决方法,