簡體   English   中英

使用 CriteriaBuilder 的 JPA 左外連接導致錯誤:部分對象查詢不允許維護緩存或被編輯

[英]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)

我怎樣才能做到這一點並擺脫錯誤?

我已經通過添加下面提到的行解決了這個問題,如果他們遇到同樣的問題,可能對其他人有用。

((org.eclipse.persistence.jpa.JpaQuery)query).getDatabaseQuery().dontMaintainCache();

這里提供另一個更好的選擇

謝謝

根據,有兩種方法可以創建條件查詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM