gpt4 book ai didi

java - Spring Data JPA,查询太慢,子查询太多而不是join

转载 作者:行者123 更新时间:2023-12-01 17:42:49 24 4
gpt4 key购买 nike

我有一个 REST 服务,它使用 Spring Data JPA 调用一个简单的 findAll 。问题是在控制台中记录了大量查询,因此我认为 Spring Data 不是对连接进行连接,而是对名为 Dis 的主类的每一行执行单个查询。

我有一个主实体,它必须仅获取一些用 @JsonView 注释的数据:

@Entity
@NamedQuery(name="Dis.findAll", query="SELECT d FROM Dis d")
public class Dis implements Serializable {
private static final long serialVersionUID = 1L;

@JsonView(View.Summary.class)
@Id
@Column(name="id_dis")
private Integer idDis;

private byte[] logo;

@JsonView(View.Summary.class)
private String text;

@JsonView(View.Summary.class)
@JsonManagedReference
//bi-directional many-to-one association to TipoValidazione
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="validazione")
private TipoValidazione tipoValidazione;

//bi-directional many-to-one association to DisComune
@OneToMany(mappedBy="dis")
private List<DisComune> disComunes;

//bi-directional many-to-one association to PdfDis
@OneToMany(mappedBy="dis")
private List<PdfDis> pdfDiss;

@JsonView(View.Summary.class)
@JsonManagedReference
//bi-directional many-to-one association to Prodotto
@OneToOne(mappedBy="dis", fetch=FetchType.EAGER)
private Prodotto prodotto;

//getter and setter
}

我设置了FetchType.EAGER(但我想我可以避免这种情况,因为这种关系是默认的),因为我总是需要这两个对象。以下是 Dis 必须在我的 findAll 中获取的 Prodotto 项:

@Entity
@NamedQuery(name="Prodotto.findAll", query="SELECT p FROM Prodotto p")
public class Prodotto implements Serializable {
private static final long serialVersionUID = 1L;

@JsonView(View.Summary.class)
@Id
@Column(name="id_prodotto")
private Integer idProdotto;

@JsonView(View.Summary.class)
@Column(name="cod_prodotto")
private String codProdotto;

@Column(name="id_classe")
private Integer idClasse;


@JsonBackReference
//bi-directional many-to-one association to Dis
@OneToOne
@JoinColumn(name="id_dis")
private Dis dis;

//getter and setter
}

以及类似的类TipoValidazione:

@Entity
@Table(name="tipo_validazione")
@NamedQuery(name="TipoValidazione.findAll", query="SELECT t FROM TipoValidazione t")
public class TipoValidazione implements Serializable {
private static final long serialVersionUID = 1L;

@JsonView(View.Summary.class)
@Id
private String validazione;

@JsonBackReference
//bi-directional many-to-one association to Dis
@OneToMany(mappedBy="tipoValidazione")
private List<Dis> diss;

//getter and setter
}

简单的 findAll 存在产生大量子查询的问题(我想每行一两个子查询,而不是进行连接),所以它可以工作,但速度非常慢且不可用.

我尝试使用不带参数的 findBy() 进行基于接口(interface)的投影,但上述问题仍然存在(奇怪的是与 Dis 相关的接口(interface) >,为接口(interface) ProdottoTipoValidazione 返回两个 null 值。

我该如何解决?我知道我可以编写一个自定义的nativeQuery,但我试图避免这种解决方案。

最佳答案

您想要做的是与您的查询进行JOIN FETCH(有多种方法可以实现此目的),以便 hibernate 将获取子表行以及父实体,而不是执行默认操作,这是一个n + 1查询。

以下是我知道的两种方法:

  1. 实现您自己的查询以包含JOIN FETCH
    @Override
@Query(value = "SELECT distinct d" +
" FROM Dis d " +
" JOIN FETCH d.disComunes ")
List<Dis> findAll();
  • 创建一个 @NamedEntityGraph,您可以在其中将查询提示应用于您选择的所有查询在实体中:
  • @Entity
    @NamedEntityGraph(name = "Dis.detail",
    attributeNodes = {@NamedAttributeNode("tipoValidazione"),
    @NamedAttributeNode("prodotto")})
    @NamedQuery(name="Dis.findAll", query="SELECT d FROM Dis d")
    public class Dis implements Serializable {

    在存储库中:

    @Override
    @EntityGraph(value = "Dis.detail" , type=EntityGraphType.FETCH)
    List<Dis> findAll();

    关于java - Spring Data JPA,查询太慢,子查询太多而不是join,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58937704/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com