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

如何通过 bibernate 在一个 hql 中加载多集 lazy

钱欣然
2023-03-14

我正在处理Web Spring hibernate项目,我的加载集有问题

我有一个java类实体

@Entity
public class Product 
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> gifts;

@ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> suggestion;

@ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    Private Set<Product> relative;
}

礼物、建议和相关设置都很懒,我不想渴望

现在我想在一个语句hibernate查询中加载礼物、建议和相关产品

对我的想法最好的建议是什么

我无法更改源代码,我想找到在加载产品时加载设置对象的方法

共有1个答案

常经赋
2023-03-14

您可以创建一个实体图,并在需要热切地获取关联时获取该图形。

1.首先在产品实体上声明实体图。

@Entity
@NamedEntityGraph(name = "products",
attributeNodes = {@NamedAttributeNode("gifts"),
  @NamedAttributeNode("suggestion"),
  @NamedAttributeNode("relative")})
public class Product
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "name")
    private String name;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private java.util.Set<Product> gifts;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> suggestion;

    @ManyToMany(cascade= CascadeType.ALL)
    @JoinTable(
            joinColumns = @JoinColumn( name="parent_id"),
            inverseJoinColumns = @JoinColumn( name="id"))
    private Set<Product> relative;
}

2.然后将图形附加到其中一个存储库方法。

public interface ProductRepository extends JpaRepository<Product, Integer> {
        @EntityGraph(value = "products")
        Optional<Product> findById(Integer id);
    }

注意:您在 EntityGraph 属性节点中声明的所有关联都将被紧急加载,而 Product 中那些不是属性节点的关联仍将被懒惰地获取。

读取LOAD和FETCH之间的区别类型:LOAD Vs FETCH

 类似资料:
  • 问题内容: 如果实体A具有与实体B的双向一对一或零对一映射。 映射如下: 和 当我对EntityA进行hql查询(或更确切地说,是命名的hql查询)时,hibernate会急切地用单独的select语句加载EntityA#propertyB。 我的问题是,如果我的hql返回1000个EntityA(所有人都有各自的EntityB),hibernate将执行n + 1个查询(第一个查询是针对Enti

  • 问题内容: 我正在使用SQL LOADER在一个表中加载多个csv文件。我发现的过程非常简单,就像 但是我不想多次使用INFILE,因为如果我有1000个以上的文件,那么我必须在控制文件脚本中提及1000次INFILE。 所以我的问题是:是否有其他方法(如任何循环/任何* .csv)加载多个文件而不使用多个infile? 谢谢你 问题答案: 解决方案1:您可以将1000个文件串联到一个大文件中,然

  • 我想通过传递一个网址来加载多个图像。与本教程不同http://www.learn2crack.com/2014/06/android-load-image-from-internet.html其中只有一个图像被下载并使用img.setImageBitmap(图像)查看;我的问题是如何将url发送到一个方法以加载该url的图像,该方法返回一个图像,然后我在图像视图中显示它。

  • 我想知道是否有可能在一次往返(网络呼叫)到Firestore数据库的过程中,通过ID列表获取多个文档。

  • 问题内容: 浏览器:Chrome V65 ChromeDriver:chromedriver.exe 2.37 网络驱动程序尝试单击元素时发生错误。以下是我的click(): 我已经等待元素可见,然后单击。但是引发异常,说“其他元素将获得点击”,如下所示: 即使我添加语句以等待ajax加载完成以单击元素,也会发生错误: 这种情况在Chrome上经常发生,可能是5次出现4次故障。没用! 现在,我必须

  • 问题内容: 我正在做熊猫分析。 我的表有700万行* 30列。单元格值的范围从-1到3随机。现在,我想根据列的值过滤掉行。 我了解如何根据多个条件进行选择,写下条件并通过“&”“ |”组合。 但是我有30列要过滤,并按相同的值过滤。例如,需要选择最后12列的值等于-1 上面的代码给了我一个布尔值。我需要实际的数据框。 这里的逻辑是“或”,表示如果任何列的值为-1,则需要选择该行。另外,很高兴知道我