Jakarta ee 条件集合字段访问

Jakarta ee 条件集合字段访问,jakarta-ee,jpa-2.0,eclipselink,criteria-api,Jakarta Ee,Jpa 2.0,Eclipselink,Criteria Api,我在使用条件访问类中的集合字段时遇到问题 我有两个实体: 首先,它映射到其他实体 @Table(name = "MAIN_ENTITY") public class MainEntity { @Id @Column(name = ID_MAIN, nullable = false, precision = 38, scale = 0) private BigDecimal id; @OneToMany(mappedBy = "mappedField")

我在使用条件访问类中的集合字段时遇到问题

我有两个实体: 首先,它映射到其他实体

@Table(name = "MAIN_ENTITY")
public class MainEntity {

    @Id
    @Column(name = ID_MAIN, nullable = false, precision = 38, scale = 0)
    private BigDecimal id;

    @OneToMany(mappedBy = "mappedField")
    private Set<SecondEntity> secondEntities = new HashSet<>(0); 

    ...................
}
我想获取MainEntity记录中的SecondEntity计数,其中字段someFlag=0

为此,我有一个扩展MainEntity并具有字段计数的类

public class MainEntityDto extends MainEntity {
    private MainEntity entity;
    private Integer count;
    ...................
}
然后我尝试构建查询,我写了以下内容:

Path secondEntitiesPath = root.<Set>get("secondEntities");
cq.select(cb.construct(MainEntityDto.class, root, cb.size(secondEntitiesPath)));
在它之后,我有另一个连接,它有我写的条件


抱歉,伙计们,如果看起来一团糟,你什么都听不懂。我被困了三天,可能想不清楚。我会更新这个主题,如果有人要求更多的代码或其他。我将非常感谢所有的评论,非常感谢

我有一些建议,现在使用一些条件条件count查询应该是这样的

final Join<MainEntity, SecondEntity> secondEntityJoin =
    root.join(secondEntities, JoinType.LEFT);
secondEntityJoin.on(cb.equal(secondEntityJoin.<BigDecimal>get("someFlag"), BigDecimal.ZERO))); 
cq.select(cb.construct(CodeSubjectDto.class, root, cb.count(secondEntityJoin)));
但现在在SQL查询中出现了新问题,因为我必须使用GROUPBY with count。这个问题将在稍后解决,我将发布最终决定。为了解决这个问题,我可以使用multiselect,或者进行第二次查询,但它不适合我们的高负载应用程序体系结构。我们还发现这个查询的权重太高,可能需要重新设计

UPD一些重要信息,为什么我一开始没有找到它:

cb.size返回maintentityd中的int->类型,以便我必须具有参数重要性为int的构造函数

cb.count返回long->In maintentitydt类型,我必须有参数maintentity的构造函数!!长


这就是为什么我不能在一开始构建它。该查询返回错误,但我不明白,构造函数有问题。

我有一些建议,现在使用一些条件条件条件计数查询应该是这样的

final Join<MainEntity, SecondEntity> secondEntityJoin =
    root.join(secondEntities, JoinType.LEFT);
secondEntityJoin.on(cb.equal(secondEntityJoin.<BigDecimal>get("someFlag"), BigDecimal.ZERO))); 
cq.select(cb.construct(CodeSubjectDto.class, root, cb.count(secondEntityJoin)));
但现在在SQL查询中出现了新问题,因为我必须使用GROUPBY with count。这个问题将在稍后解决,我将发布最终决定。为了解决这个问题,我可以使用multiselect,或者进行第二次查询,但它不适合我们的高负载应用程序体系结构。我们还发现这个查询的权重太高,可能需要重新设计

UPD一些重要信息,为什么我一开始没有找到它:

cb.size返回maintentityd中的int->类型,以便我必须具有参数重要性为int的构造函数

cb.count返回long->In maintentitydt类型,我必须有参数maintentity的构造函数!!长


这就是为什么我不能在一开始构建它。该查询返回错误,但我不明白,构造函数有问题。

您使用子查询的方法是正确的。在JPQL中,它看起来像: 选择new MainEntityDtoentity,从SecondEntity SecondEntity中选择countsecondEntities,其中secondEntities.mainEntity=entity,从mainEntity中选择secondEntities.flag=0

使用criteria API看起来像:

Subquery sq = cb.subquery(SecondEntity.class);
Root<SecondEntity> second= sq.from(SecondEntity.class);
sq.select(cb.count(second));
sq.where(cb.and(cb.equal(second.get("mainEntity"), root), cb.equal(second.get("flag"), 0));

cq.select(cb.construct(CodeSubjectDto.class, root, sq));

您使用子查询的方法是正确的。在JPQL中,它看起来像: 选择new MainEntityDtoentity,从SecondEntity SecondEntity中选择countsecondEntities,其中secondEntities.mainEntity=entity,从mainEntity中选择secondEntities.flag=0

使用criteria API看起来像:

Subquery sq = cb.subquery(SecondEntity.class);
Root<SecondEntity> second= sq.from(SecondEntity.class);
sq.select(cb.count(second));
sq.where(cb.and(cb.equal(second.get("mainEntity"), root), cb.equal(second.get("flag"), 0));

cq.select(cb.construct(CodeSubjectDto.class, root, sq));
Subquery sq = cb.subquery(SecondEntity.class);
Root<SecondEntity> second= sq.from(SecondEntity.class);
sq.select(cb.count(second));
sq.where(cb.and(cb.equal(second.get("mainEntity"), root), cb.equal(second.get("flag"), 0));

cq.select(cb.construct(CodeSubjectDto.class, root, sq));