JPA left outer join using CriteriaBuilder results in error: Partial object queries are not allowed to maintain the cache or be edited
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 class 我有以下内容
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
Exception Description: Partial object queries are not allowed to maintain
the cache or be edited.
You must use dontMaintainCache().
Query: ReadAllQuery(referenceClass=Product )
at org.eclipse.persistence.exceptions.QueryException.cannotCachePartialObjects
(QueryException.java:388)
at org.eclipse.persistence.queries.ObjectLevelReadQuery.prepareQuery
(ObjectLevelReadQuery.java:2160)
我想要实现的是生成以下 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();
提供了另一个更好的选择here
谢谢
根据this,有两种方法可以创建不带参数的条件查询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 ){...}
注意参数的顺序很重要。
我有以下实体关系
产品
@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 class 我有以下内容
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 Exception Description: Partial object queries are not allowed to maintain the cache or be edited.
You must use dontMaintainCache(). Query: ReadAllQuery(referenceClass=Product ) at org.eclipse.persistence.exceptions.QueryException.cannotCachePartialObjects (QueryException.java:388) at org.eclipse.persistence.queries.ObjectLevelReadQuery.prepareQuery (ObjectLevelReadQuery.java:2160)
我想要实现的是生成以下 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();
提供了另一个更好的选择here
谢谢
根据this,有两种方法可以创建不带参数的条件查询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 ){...}
注意参数的顺序很重要。