Весенняя проекция данных для собственного запроса, не сопоставленного с интерфейсом

#spring #spring-boot #spring-data-jpa #spring-projections

#весна #весенняя загрузка #spring-data-jpa #весенние проекции

Вопрос:

Это мой репост для извлечения элементов

 @Query(value = "SELECT DISTINCT M.ID as "id", "
          " M.NAME_PRIMARY_LANG as "name" "
          " FROM ECOMMERCE_CORE.MERCHANT_ITEMS M , "
          " ECOMMERCE_CORE.PRODUCT_UNIT_OF_MEASURE P , "
          " ECOMMERCE_CORE.LOOKUP_TYPES_STATUS S , "
          " ECOMMERCE_CORE.ITEM_TYPES T , "
          " ECOMMERCE_CORE.ITEM_PRICE I,"
          " ECOMMERCE_CORE.MERCHANT_ITEM_BRAND B, "
          " ECOMMERCE_CORE.MERCHANT_ITEM_CATEGORY C "
          " WHERE M.ID = P.PRODUCT_ID AND M.ID=I.PRODUCT_ID AND M.ID = B.MERCHANT_ITEM_ID AND  S.ID=M.STATUS_ID AND M.TYPE = T.ID AND M.MERCHANT_ID =?1 AND M.STATUS_ID =?2 "
          " AND P.BRANCH_ID = ?3 AND I.CHANNEL_ID = ?4 ",
        nativeQuery = true
)
List<ItemModelProjection> findBySupplierIdAndStatusCode(long id, long status, long branchId, long channelId, Pageable pageable);
 

и это мой интерфейс, который мне нужен, чтобы сопоставить с ним результат

     @Getter
    @EqualsAndHashCode(of = {"id"})
    public class ItemModelProjection {

    private String id;
    private String name;

    public ItemModelProjection(final String id, final String name) {
        this.id = id;
        this.name = name;
    }}
 

и результат этого запроса не сопоставлен с интерфейсом, в чем проблема для него?

Ответ №1:

Вы можете решить эту проблему и добиться результата с помощью проекций, сделав свой DTO интерфейсом с геттерами для столбцов, возвращаемых запросом.

Все, что вам нужно сделать, это иметь интерфейс и содержать домены запросов, начинающиеся с get .

 public interface ItemModelProjection {
    Long getId();
    String getName();
}
 

Ответ №2:

Вам нужен интерфейс, если вы хотите получить эти значения. И будьте осторожны с именованием методов. Если у вас есть, как в вашем случае AS name , тогда вызовите метод getName() . Но если у вас не указано, и вы возвращаете значение, например, как PRODUCT_UNIT_OF_MEASURE , тогда используйте следующее имя метода : getProduct_Unit_Of_Measure() .

Для получения этих двух значений используйте следующий интерфейс:

 public interface ItemModelProjection {

  String getId();

  String getName();

}