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

使用NamedEntityGraph进行即时抓取返回的行太多

毛淳
2023-03-14

我有以下实体:

@Entity
@NamedEntityGraph(name = "Text.WithRows", attributeNodes = { @NamedAttributeNode("rows") })
public class Text {
  @Id
  @Column(name = "uuid", nullable = false, unique = true)
  UUID uuid;

  @Column(name = "belongsTo")
  UUID belongsTo;

  @OneToMany
  @JoinColumn(name = "text_id")
  List<TextRow> rows;
}

@Entity
public class TextRow {
  @Id
  @Column(name = "uuid", nullable = false, unique = true)
  private UUID uuid;

  @Column(name = "content", nullable = false, length = 255)
  private String content;
}

我还有一个Spring数据JPA存储库,定义如下:

public interface TextRepository extends PagingAndSortingRepository<Text, UUID>, JpaSpecificationExecutor<Text> {
  @EntityGraph(value = "Text.WithRows", type = EntityGraphType.LOAD)
  List<Text> findAllByBelongsTo(UUID belongsTo)
}

当我从存储库中执行find-method时,我想急切地加载TextRow。因此,我在上面的代码中引入了NamedEntityGraph-和EntityGraph-注释。

在数据库的文本表中有2个条目,在文本行表中各有3个条目。

我希望findAllByBelongsTo方法返回一个包含两个文本实例的列表。相反,它返回一个包含6个文本实例的列表。

我不明白为什么会这样。有人能给我一些指导或解决方案吗?

谢谢你!

共有1个答案

葛子昂
2023-03-14

好吧,看来我看到的是预期的行为。Hibernate创建一个包含左外部联接的SQL。这将导致父表的n x m结果行。

这些SO问题描述了我的问题,并给了我一个解决方案:

  • Hibernate Criteria使用FetchType返回孩子多次。EAGER
  • JPA 2.1实体图返回重复的结果

简而言之,我可以这样注释我的存储库:

public interface TextRepository extends PagingAndSortingRepository<Text, UUID>, JpaSpecificationExecutor<Text> {
  @EntityGraph(value = "Text.WithRows", type = EntityGraphType.LOAD)
  @Query("SELECT DISTINCT txt FROM Text txt WHERE txt.belongsTo = :belongsTo")
  List<Text> findAllByBelongsTo(@Param("belongsTo") UUID belongsTo)
}
 类似资料:
  • 问题内容: 我想从网站上获取每天的日出/日落时间。是否可以使用Python抓取网络内容?使用什么模块?有没有可用的教程? 问题答案: 结合使用urllib2和出色的BeautifulSoup库:

  • 问题内容: 我在抓取该特定网页的数据时经历了可怕的时间…… 基本上,当我 在浏览器中加载URL并手动按F12键时,但是当我以编程方式 尝试执行此操作时,我可以在“ DOM Explorer”中看到所需的信息(参见下文)HTMLDoc不包含 我在“ DOM资源管理器”中看到的相同信息… 有人可以帮我访问“ DOM资源管理器”中的信息吗?我知道HTML并不总是您在浏览器中看到的,而是在浏器中创建可见内

  • 本文向大家介绍Python使用Scrapy框架进行抓取,包括了Python使用Scrapy框架进行抓取的使用技巧和注意事项,需要的朋友参考一下 示例 首先,您必须建立一个新的Scrapy项目。输入要存储代码并运行的目录: 要刮擦,我们需要一只蜘蛛。蜘蛛定义了如何刮除某个站点。以下是蜘蛛的代码,该代码遵循指向StackOverflow上投票最高的问题的链接,并从每个页面中抓取一些数据(源): 将您的

  • 我不知道在这里问这个问题是否正确。如果不合适,请告诉我。 我使用charles监控我的Android移动设备的http流量。它确实有效,现在我想在回复返回时做点什么。例如,我访问www.google。com和响应返回,然后我想保存响应文本或执行其他操作。

  • 问题内容: 基本上,如果我有一排以缩进开头的文本,那么获取该缩进并将其放入Python变量中的最佳方法是什么?例如,如果该行是: 然后它将返回“ \ t \ t”。或者,如果该行是: 然后它将返回四个空格。 因此,我想您可能会说,我只需要从字符串中去除所有内容,从第一个非空白字符到末尾。有什么想法吗? 问题答案: 要删除前导空格,请使用lstrip。 由于反对票可能会质疑正则表达式的效率,因此我进

  • 问题内容: 我正在遵循本指南http://doc.scrapy.org/en/0.16/topics/practices.html#run-scrapy-from- a-script 从我的脚本中运行scrapy。这是我脚本的一部分: 它的工作原理应该是:访问页面,抓取所需信息,并将输出json存储在我告诉它的位置(通过FEED_URI)。但是,当蜘蛛完成他的工作(我可以在输出json中通过数字看