Выберите данные из другой таблицы из репозитория JPA - PullRequest
1 голос
/ 08 июля 2019

У меня есть этот запрос в репозитории JPA:

@Repository
public interface PaymentTransactionsDailyFactsRepository extends JpaRepository<PaymentTransactionsDailyFacts, Integer> {

    @Query(value = "SELECT " + 
            " COUNT(*) count, " + 
            " SUM(amount) volume, " + 
            " DATE(created_at) date, " + 
            " YEAR(created_at) year, " + 
            " MONTH(created_at) month, " + 
            " WEEK(created_at) week, " + 
            " DAY(created_at) day, " + 
            " type transaction_type, " + 
            " contract_id, merchant_id, terminal_id, " + 
            " status, card_brand, currency " + 
            " FROM payment_transactions " + 
            " WHERE status NOT IN ('pending_async','pending','pending_review','in_progress','new') AND created_at BETWEEN :start_date AND :end_date " + 
            " GROUP by date, contract_id, merchant_id, terminal_id, transaction_type, status, card_brand, currency", nativeQuery = true)
    List<PaymentTransactionsDailyFacts> generateDailyFacts(@Param("start_date") LocalDate start_date, @Param("end_date") LocalDate end_date);
}

Но когда я выполняю его в Spring Scheduler, я получаю ошибку:

SQL Error: 1054, SQLState: 42S22
Caused by: java.sql.SQLSyntaxErrorException: No such column: id

Когда я выполняю этот запрос в MariaDB, он работаетотлично:

SELECT  COUNT(*) count,  SUM(amount) volume,  DATE(created_at) date,  YEAR(created_at) year,  MONTH(created_at) month,  WEEK(created_at) week,  DAY(created_at) day,  type transaction_type,  contract_id, merchant_id, terminal_id,  status, card_brand, currency  FROM payment_transactions  WHERE status NOT IN ('pending_async','pending','pending_review','in_progress','new') AND created_at BETWEEN '2011-04-11 00:00:01' AND '2029-04-11 00:00:00'  GROUP by date, contract_id, merchant_id, terminal_id, transaction_type, status, card_brand, currency

Как видите, я выполняю этот собственный запрос для таблицы payment_transactions, но ожидаю результата для таблицы payment_transactions_daily_facts.Есть ли способ правильно реализовать этот запрос?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Если вы хотите получить все PaymentTransactionsDailyFacts сущности, которые находятся между заданными start_date и end_date, и их status не является одним из ('pending_async', 'pending', 'pending_review', 'in_progress','new'), вы можете использовать следующий запрос.

@Query(value = "SELECT * " 
            " FROM payment_transactions " + 
            " WHERE status NOT IN ('pending_async','pending','pending_review','in_progress','new') AND created_at BETWEEN :start_date AND :end_date " + 
            " GROUP by date, contract_id, merchant_id, terminal_id, transaction_type, status, card_brand, currency", nativeQuery = true)

Но, поскольку вы использовали group by в своем запросе, кажется, что вы пытаетесь получить некоторые агрегированные данные, а не просто списокPaymentTransactionsDailyFacts субъектов, которые удовлетворяют условиям.Если это так, вы все делаете неправильно.Вы должны использовать проекции .

Вот краткое руководство по использованию проекций пружинных данных.https://www.baeldung.com/spring-data-jpa-projections

ИЛИ.Вы можете прочитать официальную документацию здесь.https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections

ОБНОВЛЕНИЕ: Использование проекций

  1. Сначала создайте интерфейс, как показано ниже, где-то в проекте.Вы должны настроить типы возвращаемых данных по мере необходимости.

    public interface PtdsDTO {
        Integer getCount();
        BigDecimal getVolume();
        LocalDate getDate();
        Short getYear();
        Short getMonth();
        Short getWeek();
        Short getDay();
        String getTransactionType();
        Integer getContactId();
        Integer getMerchantId();
        Integer getTerminalId();
        String getStatus();
        String getCardBrand();
        String getCurrency();
    }
    
  2. Затем импортируйте этот интерфейс вверху соответствующего репозитория.

  3. Изменитьтип возврата вашего хранилища: List<PtdsDTO>.

    List<PtdsDTO> generateDailyFacts(@Param("start_date") LocalDate start_date, @Param("end_date") LocalDate end_date);
    

Вот так.

1 голос
/ 10 июля 2019

Попробуйте добавить id в запрос

@Query(value = "SELECT " + 
            " id," + 
            " COUNT(*) count, " + 
            " SUM(amount) volume, " + 
            " DATE(created_at) date, " + 
            " YEAR(created_at) year, " + 
            " MONTH(created_at) month, " + 
            " WEEK(created_at) week, " + 
            " DAY(created_at) day, " + 
            " type transaction_type, " + 
            " contract_id, merchant_id, terminal_id, " + 
            " status, card_brand, currency " + 
            " FROM payment_transactions " + 
            " WHERE status NOT IN ('pending_async','pending','pending_review','in_progress','new') AND created_at BETWEEN :start_date AND :end_date " + 
            " GROUP by date, contract_id, merchant_id, terminal_id, transaction_type, status, card_brand, currency", nativeQuery = true)
    List<PaymentTransactionsDailyFacts> generateDailyFacts(@Param("start_date") LocalDate start_date, @Param("end_date") LocalDate end_date);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...