#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?