Witam posiadam dwie tabele stworzone poprzez klasy Encji połączone ze sobą Wiele do wielu
package pl.luppo.ztz.model;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
@Entity
@NamedQueries({ @NamedQuery(name = Purchase.ALL, query = "SELECT p FROM Purchase p "),
@NamedQuery(name = Purchase.TOTAL, query = "SELECT COUNT(p) FROM Purchase p") })
public class Purchase extends AbstractEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public final static String ALL = "PURCHASE_ALL";
public final static String TOTAL = "PURCHASE_TOTAL";
private Double sum;
private Date orderDate;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "COMPANY_ID")
private Company company;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(name = "PUR_PROD", joinColumns = { @JoinColumn(name = "PUR_ID") }, inverseJoinColumns = { @JoinColumn(name = "PRO_ID") })
private List<Product> products;
public Double getSum() {
return sum;
}
public void setSum(Double sum) {
this.sum = sum;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this.company = company;
}
public List<Product> getProducts() {
return products;
}
public void setProducts(List<Product> products) {
this.products = products;
}
public Date getOrderDate() {
return orderDate;
}
public void setOrderDate(Date orderDate) {
this.orderDate = orderDate;
}
}
oraz
package pl.luppo.ztz.model;
import java.io.Serializable;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
@Entity
@NamedQueries({
@NamedQuery(name = Product.ALL, query = "SELECT p FROM Product p "),
@NamedQuery(name = Product.TOTAL, query = "SELECT COUNT(p) FROM Product p")})
public class Product extends AbstractEntity implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public final static String ALL = "PRODUCT_ALL";
public final static String TOTAL = "PRODUCT_TOTAL";
private Double price;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MANUFACTURER_ID")
private Manufacturer manufacturer;
@ManyToMany(cascade = { CascadeType.ALL })
@JoinTable(name = "PUR_PROD", joinColumns = { @JoinColumn(name = "PRO_ID") }, inverseJoinColumns = { @JoinColumn(name = "PUR_ID") })
private List<Purchase> orders;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "CATEGOTY_ID")
private Category category;
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Manufacturer getManufacturer() {
return manufacturer;
}
public void setManufacturer(Manufacturer manufacturer) {
this.manufacturer = manufacturer;
}
public List<Purchase> getOrders() {
return orders;
}
public void setOrders(List<Purchase> orders) {
this.orders = orders;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
}
Id w obu przypadkach jest w klasie nadrzędnej AbstractEntity
Metoda która służy do zapisania obiektu purchase wygląda
public String acceptAction() {
purchase = new Purchase();
Double sum = 0D;
if (login.getProducts() != null) {
for (Product tmpProduct : login.getProducts()) {
sum = sum + tmpProduct.getPrice();
}
purchase.setSum(sum);
purchase.setProducts(login.getProducts());
purchase.setCompany(login.getCompany());
purchase.setOrderDate(new Date());
purchaseService.merge(purchase);
}
return "/web/shop/purchaseView.xhtml";
}
Po zakończeniu metody dodawania do bazy wszystko jest ok zostaje dodane tyle produktów ile wcześniej sobie wybiorę ale gdy chce później za pomocą wybrania rekordu zakupu pokazać wszystkie produkty to lista jest pusta
public List<Product> products() {
if (selectedPurchase != null) {
return selectedPurchase.getProducts();
}
return null;
}
Cały obiekt selectedPurchase jest poprawnie wypełniony oprócz listy produktów co prawda nie jest ona nullem ale nie są to produkty które zostały przypisane do zakupu
Próbowałem również dociągnąć je z bazy i też nie zadziałało
public List<Product> findProductsByPurchase(Long purchaseId){
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Product> query = builder.createQuery(Product.class);
Root<Product> root = query.from(Product.class);
Join<Product, Purchase> purchase = root.join("orders", JoinType.LEFT);
Predicate predicate = builder.conjunction();
query.select(root);
if(purchaseId != null){
predicate = builder.and(predicate, builder.equal(purchase.get("id"), purchaseId));
}
query.where(predicate);
return entityManager.createQuery(query).getResultList();
}
Proszę o pomoc jak moę pobrać listę produktów z danego zakupu