Использование @SqlResultSetMapping вызывает проблему проверки схемы - PullRequest
2 голосов
/ 06 февраля 2020

Я должен извлечь данные для статистики c. Я создал собственный запрос и использовал @SqlResultSetMapping для сопоставления набора результатов с объектом. Hibernate должен объявить этот класс (Elaboration) как @Entity НО НЕ ТАБЛИЦА, и мне не нужна таблица, потому что мне нужно только извлекать данные на лету, когда это необходимо.

Код работает нормально но конвейер 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();

Есть ли способ пройти валидационный тест? Спасибо

1 Ответ

2 голосов
/ 06 февраля 2020

Это неверное утверждение.

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 не является сущностью, вы не должны аннотировать ее как таковую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...