Разница в производительности Hibernate JPQL - PullRequest
0 голосов
/ 09 октября 2018

У меня есть следующие объекты:

Продукт:

@Entity
@Table(name = "product")
public class Product implements Serializable {
@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "price")
    private Double price;
...
@OneToMany(mappedBy = "product")
    private Set<ProductImages> images = new HashSet<>();
...

Изображения продуктов:

@Entity
@Table(name = "product_images")
public class ProductImages implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @JsonIgnore
    private Long id;

    @Column(name = "is_default")
    private Boolean isDefault;

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

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnoreProperties("images")
    private Product product;

getter & setters

Мне интересно, есть ли разница в производительности между этими двумя:

1) Стремление извлекать изображения

2 Ленивое извлечение и

Page<ProductDetailsDTO> newArrival = productRepository.getAllProductDtoByCategory(id, pageable);
        newArrival.forEach(dto -> {
        dto.setImages(productImagesRepository.getAllImagesByProductId(dto.getId()));
        });

Это только одно.У меня больше, чем 5 Set в сущности Product, и каждый раз, когда мне нужно установить некоторые значения в ней.

1 Ответ

0 голосов
/ 09 октября 2018

Выборка EAGER негативно влияет на производительность, поэтому лучше использовать стратегию выборки FetchType.LAZY для всех типов ассоциаций.

Выборка с использованием JPQL:

Product product = entityManager.createQuery(
"select p " +
        "from Product p " +
        "where p.id = :productId", Product.class)
.setParameter("productId", productId)
.getSingleResult();

Создает следующие операторы SQL SELECT:

Query:{[
select
    product0_.id as id1_18_, 
    product0_.code as code2_18_, 
    product0_.company_id as company_6_18_, 
    product0_.importer_id as importer7_18_, 
    product0_.name as name3_18_, 
    product0_.quantity as quantity4_18_, 
    product0_.version as version5_18_ 
from Product product0_ 
where product0_.id=?][1]} 

Query:{[
select
    company0_.id as id1_6_0_, 
    company0_.name as name2_6_0_ 
from Company company0_ 
where company0_.id=?][1]}

В запросах JPQL и Criteria по умолчанию выбирается выборка, поэтому выдается вторичный выбор для каждой отдельной ассоциации EAGER.Чем больше число ассоциаций, тем больше дополнительных отдельных SELECTS, тем больше это повлияет на производительность нашего приложения.

Ссылка: Выборка EAGER - это запах кода при использовании JPA и Hibernate от VLAD MIHALCEA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...