【问题标题】:The @SqlResultSetMapping usage cause the schema validation problem@SqlResultSetMapping 使用导致架构验证问题
【发布时间】:2020-05-22 07:06:30
【问题描述】:

我必须提取数据进行统计。我创建了一个本机查询并使用@SqlResultSetMapping 将结果集映射到一个对象。 Hibernate 需要将这个类(Elaboration)声明为@Entity BUT IS NOT A TABLE,我不想要一个表,因为我只需要在需要时动态提取数据。

代码工作正常,但 gitlab 管道在验证期间失败

schemaManagementException: Schema-validation: missing table [elaboration].

到目前为止,这是我的代码:

    SqlResultSetMapping(name="ValueMapping",
                     classes={
                       @ConstructorResult(
                         targetClass=Elaboration.class,
                         columns={
                           @ColumnResult(name="areadesc", type=String.class),
                           @ColumnResult(name="subsectordesc", type=String.class),
                           @ColumnResult(name="eurovalue", type=BigDecimal.class),
                           @ColumnResult(name="eurotch", type=BigDecimal.class),
                         }
                       )
                     })
    @Entity 
    public class Elaboration{
      @Id
      private Long id;
      private String areadesc;
      private String subsectordesc;
      private Integer dossiercount;
      private BigDecimal eurovalue;
      private BigDecimal eurotch; 

    ....

和自定义查询:

        String statisticValueQuery = "select  a.mdescr as areadesc, s.mdescr as subsectordesc, sum(euro_value) as eurovalue, 
    sum(euro_value_tch) as eurotch " +
                                   "from dossier d " +
                                   "join dossier_document dd on d.id = dd.dossier_id " +
                                   "join dossier_country dc on d.id = dc.dossier_id " +
                                   "join country c on dc.country_id = c.id " +
                                   "join area a on c.area_id = a.id " +
                                   "join dossier_subsector ds on d.id = ds.dossier_id " +
                                   "join subsector s on ds.subsector_id = s.id " +
                                   "where dd.document_id = :document  " +
                                   "and d.submission_date >= :startdate  and d.submission_date <= :enddate " +
                                   "group by s.id, a.id;";

      public List<Elaboration> getValueElaboration(ElaborationRequestDTO elaborationRequestDTO){

        Query resultMapping = em.createNativeQuery(statisticValueQuery, "ValueMapping");
        resultMapping.setParameter("startdate", elaborationRequestDTO.getElaborateFromEquals());
        resultMapping.setParameter("enddate", elaborationRequestDTO.getElaborateToEquals());
        resultMapping.setParameter("document", elaborationRequestDTO.getDocumentIdEquals());
        return resultMapping.getResultList();

有没有办法通过验证测试? 谢谢

【问题讨论】:

    标签: spring hibernate spring-boot jhipster


    【解决方案1】:

    这是错误的说法。

    Hibernate 需要将这个类(Elaboration)声明为@Entity

    您应该将您的 @SqlResultSetMapping 声明放在一些 @Entity 之上,但它可以是与 Elaboration 无关的其他实体。

    @SqlResultSetMapping(name="ValueMapping",
                     classes={
                       @ConstructorResult(
                         targetClass=Elaboration.class,
                         columns={
                           @ColumnResult(name="areadesc", type=String.class),
                           @ColumnResult(name="subsectordesc", type=String.class),
                           @ColumnResult(name="eurovalue", type=BigDecimal.class),
                           @ColumnResult(name="eurotch", type=BigDecimal.class),
                         }
                       )
                     })
    @Entity 
    public class SomeEntity {
    
    }
    

    如果Elaboration 不是实体,则不应对其进行注释。

    【讨论】:

    • 谢谢@Sternk 我认为将映射放在我的对象中更干净,但我误解了指南。
    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 2023-03-11
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多