JPA отображает собственный результат запроса в DTO, не являющийся объектом - PullRequest
0 голосов
/ 04 марта 2019

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

Мой класс DTO

@Data
public class Dto {

    private Long id;

    private String serial;

    private Long entry;

    private int numOfTasks;
}

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

@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() из ItemRepository, у меня возникает следующая ошибка:

org.springframework.data.mapping.PropertyReferenceException: не найдено свойство itemDetails для типа Item

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

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

1 Ответ

0 голосов
/ 04 марта 2019

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

@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

...