Java 使用criteriabuilder和entitymanager时无法获取一组对象

Java 使用criteriabuilder和entitymanager时无法获取一组对象,java,hibernate,hibernate-criteria,hibernate-entitymanager,Java,Hibernate,Hibernate Criteria,Hibernate Entitymanager,当我试图使用CriteriaBuilder和entityManager从名为SeedRecord的实体中获取一组属性时,出现以下错误: org.hibernate.hql.internal.ast.QuerySyntaxException:无法找到 类上的适当构造函数 [DTOs.EntityDTOs.affiliatelinkspersedsummarydto]。预期参数 是:long、java.lang.String、java.lang.String、POJOs.AffiliateLink

当我试图使用CriteriaBuilder和entityManager从名为SeedRecord的实体中获取一组属性时,出现以下错误:

org.hibernate.hql.internal.ast.QuerySyntaxException:无法找到 类上的适当构造函数 [DTOs.EntityDTOs.affiliatelinkspersedsummarydto]。预期参数 是:long、java.lang.String、java.lang.String、POJOs.AffiliateLink [选择新的 DTOs.EntityDTOs.AffiliatelinkspersedSummaryDTO(生成的ADIAS0.id、, generatedAlias0.varietyName,generatedAlias0.produceName, generatedAlias1)作为generatedAlias0内部联接从POJOs.SeedRecord生成 generatedAlias0.affiliateLinks作为generatedAlias1]

根据stacktrace,my AffiliateLinksPerSeedSummaryDTO包装类应该有一个构造函数,其中包含一个类型为
Pojo.AffiliateLink
的字段。然而,实际字段是对一组Affiliatelinks的引用,而不是对单个Affiliatelink行的引用,因此这没有任何意义。有人能告诉我是什么引起的吗?以下是包装器类的代码:

public class AffiliateLinksPerSeedSummaryDTO {
    private long id;
    private String varietyName;
    private String produceName;
    @JsonIgnore
    private Set<AffiliateLink> affiliateLinks;
    private long specificCount;
    private long generalCount;

    public AffiliateLinksPerSeedSummaryDTO(long id, String varietyName, String produceName, Set<AffiliateLink> affiliateLinks) {
        this.id = id;
        this.varietyName = varietyName;
        this.produceName = produceName;
        this.affiliateLinks = affiliateLinks;
    }
public类affiliatelinksperseedsumarydto{
私人长id;
私有字符串变量名;
私有字符串produceName;
@杰索尼奥雷
私人设置附属链接;
私人长记数;
私人长期总账户;
public affiliatelinksperseedsumarydto(长id、字符串varietyName、字符串produceName、Set affiliateLinks){
this.id=id;
this.varietyName=varietyName;
this.produceName=produceName;
this.affiliateLinks=affiliateLinks;
}
所有字段名与SeedRecord字段名完全相同

下面是我用来获取所需字段/对象的代码片段

    EntityManager em = seedRecordDao.getEntityManager();
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<AffiliateLinksPerSeedSummaryDTO> criteria = builder.createQuery(AffiliateLinksPerSeedSummaryDTO.class);
    Root<SeedRecord> seedRecordRoot = criteria.from(SeedRecord.class);
    criteria.select(
            builder.construct(
                    AffiliateLinksPerSeedSummaryDTO.class,
                    seedRecordRoot.get("id"),
                    seedRecordRoot.get("varietyName"),
                    seedRecordRoot.get("produceName"),
                    seedRecordRoot.join("affiliateLinks")));

    List<AffiliateLinksPerSeedSummaryDTO> affiliateLinksPerSeed = em.createQuery(criteria).getResultList();
EntityManager em=seedRecordDao.getEntityManager();
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery criteria=builder.createQuery(AffiliateLinksPerSeedSummaryDTO.class);
Root-seedRecordRoot=criteria.from(SeedRecord.class);
条件。选择(
建筑商(
附加链接将摘要发送到类,
seedRecordRoot.get(“id”),
seedRecordRoot.get(“varietyName”),
seedRecordRoot.get(“produceName”),
seedRecordRoot.join(“affiliateLinks”);
List affiliateLinksPerSeed=em.createQuery(条件).getResultList();
编辑:我最近的尝试是通过检索元组而不是使用包装器对象来实现。现在的问题是,尽管数据库中存在值,但resultlist为零。这就是我现在所做的:

    public Set<AffiliateLinksPerSeedSummaryDTO> getAffiliateLinksPerSeed(){
        EntityManager em = seedRecordDao.getEntityManager();
        CriteriaBuilder builder = em.getCriteriaBuilder();
        Metamodel m = em.getMetamodel();
        EntityType<SeedRecord> SeedRecord_ = m.entity(SeedRecord.class);
        CriteriaQuery<Tuple> criteria = builder.createTupleQuery();
        Root<SeedRecord> seedRecordRoot = criteria.from(SeedRecord.class);
        Path<Long> idPath = seedRecordRoot.get( "id" );
        Path<String> varietyNamePath = seedRecordRoot.get("varietyName");
        Path<String> produceNamePath = seedRecordRoot.get("produceName");
        Join<SeedRecord,AffiliateLink> affiliateLinks = seedRecordRoot.join("affiliateLinks");
        criteria.multiselect(idPath,varietyNamePath,produceNamePath);

//        criteria.select(
//                builder.construct(
//                        AffiliateLinksPerSeedSummaryDTO.class,
//                        seedRecordRoot.get("id"),
//                        seedRecordRoot.get("varietyName"),
//                        seedRecordRoot.get("produceName"),
//                        seedRecordRoot.get(SeedRecord_.getSet("affiliateLinks",AffiliateLink.class))));

        List<Tuple> affiliateLinksPerSeed = em.createQuery(criteria).getResultList();
        log.info("the count is: " + affiliateLinksPerSeed.size());
                //seedRecordDao.getAffiliateLinksPerSeed();
        return affiliateLinksPerSeed.stream().map(tuple ->{
            Map<Boolean, Long> collect = ((List<AffiliateLink>)tuple.get(affiliateLinks)).stream()
                    .collect(Collectors.partitioningBy(AffiliateLink::isGeneral, Collectors.counting()));
            return new AffiliateLinksPerSeedSummaryDTO(((Long)tuple.get(idPath)), ((String)tuple.get(varietyNamePath)), ((String)tuple.get(produceNamePath)),collect.get(true), collect.get(false));
        }).collect(Collectors.toSet());
    }
public Set getAffiliateLinksPerSeed(){
EntityManager em=seedRecordDao.getEntityManager();
CriteriaBuilder=em.getCriteriaBuilder();
元模型m=em.getMetamodel();
EntityType SeedRecord=m.entity(SeedRecord.class);
CriteriaQuery criteria=builder.createTupleQuery();
Root-seedRecordRoot=criteria.from(SeedRecord.class);
路径idPath=seedRecordRoot.get(“id”);
路径varietyNamePath=seedRecordRoot.get(“varietyName”);
Path produceNamePath=seedRecordRoot.get(“produceName”);
Join affiliateLinks=seedRecordRoot.Join(“affiliateLinks”);
multiselect(idPath、varietyNamePath、produceNamePath);
//条件。选择(
//建筑商(
//附加链接将摘要发送到类,
//seedRecordRoot.get(“id”),
//seedRecordRoot.get(“varietyName”),
//seedRecordRoot.get(“produceName”),
//get(SeedRecord_u2;.getSet(“affiliateLinks”,AffiliateLink.class));
List affiliateLinksPerSeed=em.createQuery(条件).getResultList();
log.info(“计数为:+AffiliatelinksPersed.size());
//seedRecordDao.getAffiliatelinksPersed();
返回affiliateLinksPerSeed.stream().map(元组->{
Map collect=((列表)tuple.get(affiliateLinks)).stream()
.collect(Collectors.partitionby(AffiliateLink::isGeneral,Collectors.counting());
返回新的AffiliateLinksPerSeedSummaryDTO(((长)tuple.get(idPath)),((字符串)tuple.get(varietyNamePath)),((字符串)tuple.get(produceNamePath)),collect.get(true),collect.get(false));
}).collect(收集器.toSet());
}
试试看


fetch
也许?我很想试试你的建议,但我还有一个问题,你能检查一下我的编辑吗?
seedRecordRoot.joinSet("affiliateLinks")