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

Я пытаюсь получить не-объектный объект, используя собственный запрос, который я хотел бы использовать в качестве модели для представления на одной из страниц моего приложения.Я следую этому объяснению, которое не идет в подробностях, оно больше похоже на шпаргалку для того, кто уже знаком с этой темой и нуждается только в напоминании.Есть похожие вопросы здесь и здесь давным-давно, и, поскольку я не могу понять, куда именно должны идти предоставленные блоки кода, я подумал, что могу задать новый вопрос.Что бы я ни пытался, я получаю это исключение:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type

Вот мой класс модели:

public class ProductForHomeView {

    private int id;
    private String title;
    private EProductType productType;
    private double price;
    private int quantity;

    public ProductForHomeView(int id, String title, EProductType productType, double price, int quantity) {
        this.id = id;
        this.title = title;
        this.productType = productType;
        this.price = price;
        this.quantity = quantity;
    }

Интерфейс репозитория:

public interface IProductsRepository extends CrudRepository<Products, Integer> {
    @Query(value = "SELECT products.id, products.title, products.the_type AS productType, stock.price, stock.quantity FROM products LEFT JOIN stock on products.id=stock.product_id", nativeQuery = true)
    List<ProductForHomeView> getProductsInfoForTheHomePage();   
}

И один изклассы сущностей, в которых я пытаюсь отобразить класс не-сущности:

@Entity
@Table(name = "stock")
@SqlResultSetMapping(
        name="ProductForHomeViewMapping",
        classes={
        @ConstructorResult(
        targetClass=qualified.name.ProductForHomeView.class,
        columns={
        @ColumnResult(name="id", type=Integer.class),
        @ColumnResult(name="title", type=String.class),
        @ColumnResult(name="productType", type=EProductType.class),
        @ColumnResult(name="price", type=Long.class),
        @ColumnResult(name="quantity", type=String.class)
        })})
public class Stock {
// mapped fields, constructors, geters and setters...
}

Я ценю любой ввод!

Ответы [ 2 ]

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

Вы можете объявить свое представление как интерфейс, и тогда Spring Data будет обрабатывать его так, как вам нужно.

Вот пример:

https://github.com/roberthunt/spring-data-native-query-projection/blob/master/src/main/java/uk/co/rbrt/PersonSummary.java

https://github.com/roberthunt/spring-data-native-query-projection/blob/master/src/main/java/uk/co/rbrt/PersonRepository.java

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

Я использовал @SqlResultSetMapping с @NamedNativeQuery

Измените метод хранилища Curd следующим образом

public interface IProductsRepository extends CrudRepository<Products, Integer> {
    @NamedNativeQuery(value = "SELECT products.id, products.title, products.the_type AS productType, stock.price, stock.quantity FROM products LEFT JOIN stock on products.id=stock.product_id", resultSetMapping = "ProductForHomeViewMapping")
    List<ProductForHomeView> getProductsInfoForTheHomePage();   
}

Более подробная информация доступна здесь

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