Как получить сущности из объединяемой таблицы с одним из значений столбца из условия сопоставления в? - PullRequest
0 голосов
/ 02 мая 2019

Я настраиваю проект Spring-Data-JPA для получения списка продуктов из объединяемой таблицы с сопоставлением клиента и продукта вместе с текущим состоянием. Как я могу получить список продуктов для предоставленного customerId с помощью API критериев JPA без создания объектадля клиента?

Я прочитал, что получение списка продуктов с использованием @NamedQuery возможно путем предоставления customerId в предложении where. Я создал составную структуру ключей для Customer и Product в виде CustomerProductId (@Embeddable), имеющего сопоставление customerId и productIdи сущность CustomerProduct (@Entity) для хранения данных таблицы.

У меня есть объединенная таблица customer_product, содержащая сопоставление столбцов customer_id, product_id, created_on и current_status.

id INT(11) NOT NULL
customer_id INT(11) NOT NULL
product_id INT(11) NOT NULL
created_on DATETIME(6) NOT NULL
current_status ENUM('CART','WISHLIST','ORDERED')

Из этой таблицы соединений я хочу получить список продуктов для данного customerId с использованием API-критериев JPA без создания Customer сущности.

product структура таблицы:

id INT(11) NOT NULL
created_on DATETIME(6) NOT NULL
NAME VARCHAR(50) NOT NULL
description VARCHAR(1000) NULL

product_seller структура таблицы:

id INT(11) NOT NULL
product_id INT(11) NOT NULL
seller_id INT(11) NOT NULL
created_on DATETIME(6) NOT NULL
availability BOOLEAN  

Класс продукта содержит набор продавцов, которые также являются mapped с использованием дополнительной таблицы соединений product_seller

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

    @NotBlank
    private String name;

    @OneToMany(cascade = CascadeType.REMOVE)
    @JoinTable(name = "product_seller", joinColumns = 
    @JoinColumn(referencedColumnName = "product_id"),inverseJoinColumns = 
    @JoinColumn(referencedColumnName = "seller_id"))
    private Set<Seller> sellers;

    //Setters and getters
}
@Embeddable
public class CustomerProductId implements Serializable{
  @Column(name="customer_id")
  private Long customerId;

  @Column(name="product_id")
  private Long productId;

  //equals and hashcode method
  //Setters and getters
}

@Entity
@Table(name="customer_product")
public class CustomerProduct{

  @EmbeddedId
  private CustomerProductId customerProductId;

  @ManyToOne
  @MapsId("customerId")
  @Column(name="customer_id")
  private Long customerId;

  @ManyToOne
  @MapsId("productId") 
  private Product product;

  @Column(nullable = false)
  @Temporal(TemporalType.TIMESTAMP)
  @CreatedDate
  private Date createdOn;

  //Setters and getters
}

Как можно следовать реализации API критериев JPA, используемой для получения списка продуктов для данного customerId?

@Autowired
private EntityManager entityManager;
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Product> criteriaQuery = criteriaBuilder.createQuery(Product.class);
Root<CustomerProduct> customerProductRoot = criteriaQuery.from(CustomerProduct.class);
criteriaQuery.where(criteriaBuilder.equal(customerProductRoot.get("customerId"),customerId));

Join<CustomerProduct, Product> product= customerProductRoot.join("product");

CriteriaQuery<Product> selectCriteriaQuery = criteriaQuery.select(product);
TypedQuery<Product> query = entityManager.createQuery(selectCriteriaQuery);
return query.getResultList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...