【发布时间】:2016-03-26 20:53:51
【问题描述】:
我有 2 个具有 OneToMany 关系的实体。
@Entity
public class Table1 implements Serializable {
@Id
private Long id;
private String field1;
private String field2;
private String field3;
@OneToMany
@JoinColumn(name = "table1_id")
private Set<Table2> tables2;
}
@Entity
public class Table2 {
@Id
private Long id;
private String field1;
}
我想使用标准生成器从 Table1 获取数据到附加对象 Table1Trimmed
public class Table1Trimmed {
private Long id;
private Set<Table2> tables2;
public Table1Trimmed(Long id, Set<Table2> tables2) {
this.id = id;
this.tables2 = tables2;
}
}
我就是这样做的
CriteriaQuery<Table1Trimmed> cq = criteriaBuilder.createQuery(Table1Trimmed.class);
Root<Table1> table1Root = cq.from(Table1.class);
SetJoin<Table1, Table2> tables2Join = table1Root.joinSet("tables2");
cq.select(criteriaBuilder.construct(Table1Trimmed.class, table1Root.get("id"), tables2Join));
List<Table1Trimmed> tables1Trimmed = em.createQuery(cq).getResultList();
但是当我运行我的应用程序时,我收到了这个错误
java.lang.NoSuchMethodException: Table1Trimmed.<init>(java.lang.Long, Table2)
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.getConstructor(Class.java:1825)
at org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getConstructorFor(PrivilegedAccessHelper.java:172)
at org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl.populateAndSetConstructorSelection(CriteriaQueryImpl.java:400)
at org.eclipse.persistence.internal.jpa.querydef.CriteriaQueryImpl.select(CriteriaQueryImpl.java:93)
这意味着框架想要将 Table2 类的对象注入到我的 Table1Trimmed 构造函数中,而不是 Table2 对象的 Set。有没有办法使用标准构建器来实现这一点?
【问题讨论】:
-
您不能在 JPQL 或 Criteria 查询中选择多值字段(这实际上就是您使用构造所做的事情)。请参阅 JPA 规范 JPQL“BNF”表示法
标签: java jpa eclipselink criteria criteria-api