代码之家  ›  专栏  ›  技术社区  ›  Maurice

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

  •  0
  • Maurice  · 技术社区  · 8 年前

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

    org.hibernate.hql.internal.ast.querysyntaxception:找不到 类上的适当构造函数 [DTO.EntityDTO.AffiliatelinksPersedSummaryDTO]。预期参数 分别是:long、java.lang.String、java.lang.String、POJOs.AffiliateLink [选择新的 DTOs.EntityDTOs.affiliatelinkspersedsummarydto(generatedAlias0.id, generatedAlias0.varietyName、generatedAlias0.produceName, generatedAlias1)从POJOs.SeedRecord作为generatedAlias0内部连接 generatedAlias0.附属链接为generatedAlias1]

    根据stacktrace,包装类的affiliatelinkspersedsummarydto应该有一个构造函数,该构造函数包含一个类型为 Pojo.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;
        }
    

    所有字段名与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();
    

    编辑:我最近的一次尝试是通过检索元组而不是使用包装器对象。现在的问题是,尽管数据库中有值,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());
        }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Antoniossss    8 年前

    尝试

    seedRecordRoot.joinSet("affiliateLinks")