![](/img/trans.png)
[英]JPA CriteriaBuilder left outer join for table with no relations?
[英]JPA left outer join using CriteriaBuilder results in error: Partial object queries are not allowed to maintain the cache or be edited
我有以下實體關系
產品
@Entity
@Table(name="PRODUCTS")
public class Product
@Id
@Column(name="product_id")
private long productId;
@ManyToOne
@JoinColumn(name="EMP_NUMBER")
private Employee employee3;
....
....
員工
@Entity
@Table(name="EMPLOYEES")
public class Employee
@Id
@Column(name="EMP_NUMBER")
private String empNumber;
@Column(name="EMP_NAME")
private String employeeName;
@OneToMany(mappedBy="employee3")
private List<Product> Product3;
....
....
在 DAOImpl 類中,我有以下內容
CriteriaBuilder cb = getEntityManager().getCriteriaBuilder();
CriteriaQuery<Product> cq =
cb.createQuery(Product.class);
Root<Product> c = cq.from(Product.class);
Join<Product, Employee> join =
c.join(Product_.employee3, JoinType.LEFT);
cq.multiselect(c.get(Product_.productId),
c.get(Product_.employee3));
但是,當我執行時,出現以下錯誤
org.eclipse.persistence.exceptions.QueryException 異常說明:部分對象查詢不允許維護緩存或被編輯。
您必須使用 dontMaintainCache()。 查詢:在 org.eclipse.persistence.exceptions.QueryException.cannotCachePartialObjects (QueryException.java:388) 在 org.eclipse.persistence.queries.ObjectLevelReadQuery.prepareQuery (ObjectLevelReadQuery.java:2160) 的 ReadAllQuery(referenceClass=Product)
我想要實現的是生成以下 SQL
SELECT p.product_id,
emp.emp_name
FROM products p
LEFT OUTER JOIN employees emp
ON (p.emp_number = emp.emp_number)
我怎樣才能做到這一點並擺脫錯誤?
根據此,有兩種方法可以創建條件查詢createQuery(class)
和createQuery()
不帶參數。 第一個方法創建一個 CriteriaQuery 將結果轉換為class
。
這意味着要解決問題,您可以更改CriteriaQuery<Product> cq = cb.createQuery(Product.class);
到這一點CriteriaQuery<Product> cq = cb.createQuery();
.
然后使用Iterator
來檢索結果。
Iterator products = query.getResultList().iterator();
在我的情況下,根據這個: https ://bugs.eclipse.org/bugs/show_bug.cgi?id=303205 當您應用多選並且在表示對象中沒有具有選定參數的構造函數時會發生此問題.
例如,如果你有
Select empNumber,employeeName from Employee
然后在您的實體或表示對象中,您需要一個構造函數:
public Employee(int empNumber, StringemployeeName ){...}
因為參數的順序很重要,所以要小心。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.