[英]Why does Criteria API throw StackOverFlow Exception?
我有 2 個實體,它們之間存在一對一的關系:客戶和購物車。 Customer 是 cart 的所有者,因此 FK 的一列是指向 Cart PK 的 Customer 表。
這是購物車 class:
@Entity
@Table(name = "testCart_cart")
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cart_id", unique = true, nullable = false)
private long id;
@OneToMany(cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY)
@JoinColumn(name = "cart_id")
private List<CartItem> listOfCartItems;
@OneToOne(mappedBy = "cart",
fetch = FetchType.LAZY)
private Customer customer;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public List<CartItem> getListOfCartItems() {
return listOfCartItems;
}
public void setListOfCartItems(List<CartItem> listOfCartItems) {
this.listOfCartItems = listOfCartItems;
}
public void setCustomer(Customer customer) { this.customer = customer; }
public Customer getCustomer() { return customer; }
@Override
public String toString() {
return "Cart{" +
"id=" + id +
", listOfCartItems=" + listOfCartItems +
", customer=" + customer +
'}';
}
}
這是我的客戶 class:
@Entity
@Table(name = "testCart_customer")
public class Customer implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name = "id", unique = true, nullable = false)
private long id;
@Column(name = "username", unique = true, nullable = false)
private String username;
@OneToOne(cascade = CascadeType.ALL,
fetch = FetchType.LAZY)
@JoinColumn(name = "cart_id")
private Cart cart;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Cart getCart() {
return cart;
}
public void setCart(Cart cart) {
this.cart = cart;
}
@Override
public String toString() {
return "Costumer name: " + username;
}
}
所以,我用標准 API 代替 JPQL(對我來說更容易)。
這是我的代碼:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Cart> query = cb.createQuery(Cart.class);
Root<Customer> customer = query.from(Customer.class);
ParameterExpression<String> strignParameter = cb.parameter(String.class);
Join<Customer, Cart> carts = customer.join("cart");
query.select(carts).where(cb.equal(customer.get("username"),name));
Cart cart = entityManager.createQuery(query).getSingleResult();
return cart;
這是在控制台中:
Exception in thread "main" java.lang.StackOverflowError
at org.hibernate.query.sqm.tree.domain.AbstractSqmAttributeJoin.getNodeJavaTypeDescriptor(AbstractSqmAttributeJoin.java:71)
at org.hibernate.query.sqm.tree.domain.SqmSingularJoin.getJavaTypeDescriptor(SqmSingularJoin.java:52)
at org.hibernate.query.sqm.tree.domain.AbstractSqmAttributeJoin.getNodeJavaTypeDescriptor(AbstractSqmAttributeJoin.java:71)
at org.hibernate.query.sqm.tree.domain.SqmSingularJoin.getJavaTypeDescriptor(SqmSingularJoin.java:52)
at org.hibernate.query.sqm.tree.domain.AbstractSqmAttributeJoin.getNodeJavaTypeDescriptor(AbstractSqmAttributeJoin.java:71)
at org.hibernate.query.sqm.tree.domain.SqmSingularJoin.getJavaTypeDescriptor(SqmSingularJoin.java:52)
總共有 1024 個電話。
嘗試了來自多個來源的不同方法,並嘗試使用調試器 go 以查看發生了什么,機器人沒有真正解釋。 當調試器從query.select...跳轉到Cart cart...時會拋出錯誤。
當你想要購物車時,為什么要從客戶開始。
試試這個:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Cart> query = cb.createQuery(Cart.class);
Root<Cart> cart = query.from(Cart.class);
ParameterExpression<String> strignParameter = cb.parameter(String.class);
Join<Cart, Customer> customer = cart.join("customer");
query.select(cart).where(cb.equal(customer.get("username"), name));
Cart cart = entityManager.createQuery(query).getSingleResult();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.