JPA сопоставляет результат собственного запроса с не сущностным DTO

#java #spring-boot #jpa #spring-data-jpa #sqlresultsetmapping

#java #весенняя загрузка #jpa #spring-data-jpa #sqlresultsetmapping

Вопрос:

У меня сложный собственный запрос, и я пытаюсь сопоставить его результат с не сущностным классом DTO. Я пытаюсь использовать JPA ‘s SqlResultSetMapping с ConstructorResult

Мой класс DTO

 @Data
public class Dto {

    private Long id;

    private String serial;

    private Long entry;

    private int numOfTasks;
}
  

Мой класс entity, который имеет интерфейс репозитория, который я буду называть этим результатом собственного запроса.

 @SqlResultSetMapping(
        name = "itemDetailsMapping",
        classes = {
                @ConstructorResult(
                        targetClass = Dto.class,
                        columns = {
                                @ColumnResult(name = "ID"),
                                @ColumnResult(name = "SERIAL"),
                                @ColumnResult(name = "ENTRY"),
                                @ColumnResult(name = "TASKS")
                        }
                )
        }
)

@NamedNativeQuery(name = "getItemDetails", query = "complex query is here", resultSetMapping = "itemDetailsMapping")
@Entity
@Data
public class Item {}
  

Репозиторий

 @Repository
public interface ItemRepository extends JpaRepository<Item, Long> {

    ...     

    List<Dto> getItemDetails();

}
  

Когда я вызываю getItemDetails() from ItemRepository , у меня возникает следующая ошибка:

org.springframework.data.mapping.Исключение PropertyReferenceException: не найдено свойств ItemDetails для типа Item

Как правильно использовать SqlResultSetMapping и ConstructorResult и решить эту проблему.

Будем признательны за любую помощь.

Ответ №1:

Для использования именованных запросов имя именованного запроса должно иметь имя сущности в качестве префикса:

 @NamedNativeQuery(name = "Item.getItemDetails", 
                 query = "complex query is here", resultSetMapping = "itemDetailsMapping")
  

Тогда метод интерфейса должен иметь то же имя, что и именованный запрос, без префикса:

 List<Dto> getItemDetails();
  

Подробнее о Spring Data JPA и именованных запросах читайте в справочном документе https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.named-queries

Комментарии:

1. На самом деле, это моя ошибка, мой метод называется getItemDetails, но мне пришлось добавить элемент. префикс в начале имени. Спасибо за ответ.

2. Есть идеи, почему вы не используете RowMapper?

3. @Anil Может быть, потому, что SqlResultSetMapping является стандартом JPA?