java - 条件构建器 joinSet 获取对象而不是对象集

标签 java jpa eclipselink criteria criteria-api

我有 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 类的对象注入(inject)到我的 Table1Trimmed 构造函数中,而不是 Table2 对象集。有没有办法使用标准生成器来实现这一目标?

最佳答案

最佳解决方案是创建仅包含特定字段的附加只读实体。

@ReadOnly
@Entity("table1trimmed")
@Table("table1")
public class Table1Trimmed {

    @Id
    private Long id;
    @OneToOne
    @JoinFetch(JoinFetchType.OUTER)
    @JoinColumn(name = "table1_id")
    private Set<Table2> tables2;

}

好吧,我在这里找到了间接答案[1]

[1] 2 JPA entities on the same table

关于java - 条件构建器 joinSet 获取对象而不是对象集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36240756/

相关文章:

java - 如何将字符串和图像数据从一个 Activity 传递到 Android 中的另一个 Activity?

java - Config.class 中的 CacheManager bean 定义导致 NoSuchBeanDefinitionException

java - EclipseLink 查询 - 从学生中选择计数(*)不工作

eclipselink - 使用 spring data jpa 和 eclipselink 进行 Multi-Tenancy

java - 如何使用 for 循环在 if 条件为 true 时始终将字符串更改为另一个字符串并更改为数组中的另一个

java - 在 Android 中复制的重复文件

java - 使用带有多对多映射的 QueryDSL JPA 编写查询

java - 将外部属性放入命名查询中

java - 从一对多关系获取列表时出错,字段列表中的未知列 '***'

mysql - Hibernate 数据库特定的 columnDefinition 值