Неспособность выполнить проекцию в запросе JPA - PullRequest
0 голосов
/ 14 октября 2019

Извините за грязный SQL-запрос.

У меня есть эта структура данных

@Entity
public class Stock {

//Composite PK?
@Id
@NotNull
private String id;
@NotNull
private String product_id;
@NotNull
private Integer quantity;
@NotNull
private LocalDateTime timestamp;

И

public class ProductSold {

    private String productId;
    private Integer itemsSold;

Оба класса с правильными конструкторами.

У меня есть соответствующий репозиторий для Stock

public interface StockRepository extends JpaRepository<Stock, String> {

Я пытаюсь сделать сложный SQL-запрос (комментарий легче визуализировать), где он должен вернуть мне список ProductSoldвместо Stock

 /*
SELECT (t1.quantity - t2.quantity) as itemsSold, t1.product_id as pd
FROM stock t1 CROSS JOIN
 stock t2
WHERE MONTH(t1.timestamp) = 8 AND DAY(t1.timestamp) = 26
AND MONTH(t2.timestamp) = 8 AND DAY(t2.timestamp) = 27
AND t1.product_id = t2.product_id
ORDER BY itemsSold DESC
LIMIT 3;
 */

//Not working, not too sure why, says it can't find column quantity. In my view it should be working since it's a valid SQL Query.
@Query(value = "SELECT  new com.stock.stock.model.ProductSold(t1.product_id as productId, (t1.quantity - t2.quantity) as itemsSold )" +
        "    FROM Stock t1 CROSS JOIN Stock t2" +
        "    WHERE MONTH(t1.timestamp) = ?1 AND DAY(t1.timestamp) = ?2" +
        "    AND MONTH(t2.timestamp) = ?3 AND DAY(t2.timestamp) = ?4" +
        "    AND t1.product_id = t2.product_id" +
        "    ORDER BY itemsSold DESC" +
        "    LIMIT 3", nativeQuery = true)
List<ProductSold> findItemsSoldByTimestamp(int month1, int day1, int month2, int day2);

Но я получаю следующее:

org.h2.jdbc.JdbcSQLSyntaxErrorException: синтаксическая ошибка в выражении SQL "SELECT NEW COM. [*] STOCK.STOCK. MODEL.PRODUCTSOLD (T1.PRODUCT_ID AS PRODUCTID, (T1.QUANTITY - T2.QUANTITY) AS ITEMSSOLD) ....

Есть идеи, что не так? Я пробовал не конструировать в выражении SQL, но яполучить ConverterNotFoundException

1 Ответ

0 голосов
/ 15 октября 2019

Вы используете выражение конструктора, которое доступно только в JPQL, но вы также помечаете свой запрос как собственный, т. Е. SQL, которым он не является.

...