Я настраиваю проект 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();