카테고리 없음

술어에 대한 결합을 설정하는 방법

기록만이살길 2021. 2. 25. 08:30
반응형

술어에 대한 결합을 설정하는 방법

1. 질문(문제점):

제품에 대한 엔티티가 있습니다.

package com.javaschool.entity;

import lombok.*;

import javax.persistence.*;
import java.util.Set;

@EqualsAndHashCode(of = {"id"})
@ToString(of = { "id", "quantity", "price", "model"})
@Entity
@Table(name = "products")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Product {

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

    @Column(name = "quantity")
    private int quantity;

    @Column(name = "price")
    private int price;

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

    @Column(name = "is_active")
    private boolean active;

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

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "category_id")
    private Category category;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "brand_id")
    private Brand brand;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "season_id")
    private Season season;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "color_id")
    private Color color;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "material_id")
    private Material material;

    @ManyToOne(fetch = FetchType.EAGER, optional = false)
    @JoinColumn(name = "size_id")
    private Size size;

    @ManyToMany(mappedBy = "productSet", fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
    private Set<Order> orderSet;
}

카테고리, 시즌, 색상, 브랜드 및 기타 관련 매개 변수별로
필터링하고 싶습니다. 현재 내 필터링 기능은 다음과 같습니다. 모델, 가격, 수량과 같은 매개 변수에 대해 작동합니다. 즉,이 테이블의 데이터이고 다른 데이터의 데이터가 아닙니다. 다른 테이블에서 가져온 매개 변수로 필터링하려면 어떻게해야합니까?

@Override
    public List<Product> findByParam(List<SearchCriteria> params) {
        CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
        CriteriaQuery<Product> criteriaQuery = criteriaBuilder.createQuery(Product.class);
        Root<Product> root = criteriaQuery.from(Product.class);

        Predicate predicate = criteriaBuilder.conjunction();

        ProductSearchQueryCriteriaConsumer productConsumer = new ProductSearchQueryCriteriaConsumer(predicate, criteriaBuilder, root);

        params.stream().forEach(productConsumer);

        predicate = productConsumer.getPredicate();

        criteriaQuery.where(criteriaBuilder.equal(root.get(Product_.active), true),
                predicate);

        List<Product> result = entityManager.createQuery(criteriaQuery).getResultList();

        return result;
    }

나는 당신이 그런 전화를 걸 수 있고 모든 것이 잘 될 것이라고 생각했습니다. 그러나 나는 틀렸다.

List<SearchCriteria> params = new ArrayList<SearchCriteria>();
        params.add(new SearchCriteria("season_id", ":", "3"));

        List<ProductDto> productDtoList = productService.getProductsByParam(params);

2. 해결방안:

내 SearchCriteria

@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchCriteria {
    private String key;
    private String operation;
    private Object value;
}

이것을 만들어야합니다 :

    List<SearchCriteria> params = new ArrayList<SearchCriteria>();
    params.add(new SearchCriteria("category", ":", categoryRepository.findById(1)));

즉, 값 개체에 대한 검색 기준에서이 클래스의 개체를 전달하여 필터링합니다.

65782241
반응형