Как конвертировать Datetime в Date в запросе JPA - PullRequest
0 голосов
/ 23 января 2019

Я пишу сложные запросы, используя данные JPA Spring, скажем, запрос статистики.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsPair {
  private LocalDateTime time;
  private BigDecimal balance;
}

@Data
@Entity
@Table(name="t_order")
public class Order {
  private LocalDateTime createdTime;
  private BigDecimal amount;
  private OrderStatus status;
}

запрос в хранилище:

@Query("select new xxx.StatisticsPair(createdTime, sum(amount)) from Order where createdTime >= ?1 and createdTime <= ?2 and status = xxx.OrderStatus.COMPLETED group by createdTime")
List<StatisticsPair> statAmountByDay(LocalDateTime from, LocalDateTime to);

метод statAmountByDay дает мнерезультат вроде:

[
  {"time": "2006-01-02 15:04:05", "balance": 100.00}
  {"time": "2006-01-02 16:04:05", "balance": 200.00}
  {"time": "2006-01-03 15:04:05", "balance": 200.00}
]

но мне нужна статистика по дням, нужна только дата, время бесполезно, ожидаемый результат:

[
  {"time": "2006-01-02", "balance": 300.00}
  {"time": "2006-01-03", "balance": 200.00}
]

, поэтому я хочу знать, как конвертировать createdTime(тип datetime) - Date, например, функция DATE(createdTime) в mysql, но я не хочу использовать нативный запрос, потому что мой код работает на разных ENV, используют разные базы данных.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

У вас есть два возможных решения:

  1. Измените LocalDateTime в объекте StatisticsPair так, чтобы вместо LocalDateTime вместо LocalDateTime использовался LocalDate, и, надеюсь, пружинный JPA будет принимать только компонент даты:

....

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsPair {
    private LocalDate date;
    private BigDecimal balance;
}
Второе решение - манипулировать потоками Java и Java по списку StatisticsPair:

....

List<StatisticsPair> list = ... ;
List<StatisticsPairWithDate> listWithDate;
listWithDate = list
            .stream()
            .map(sp-> 
                    new StatisticsPairWithDate(
                            sp.getTime().toLocalDate(), 
                            sp.getBalance()))
            .collect(Collectors.toList()); 

....

@Data
@AllArgsConstructor
@NoArgsConstructor
public class StatisticsPairWithDate {
  private LocalDate date;
  private BigDecimal balance;
}

============================================ *

@Query("select new xxx.StatisticsPair(createdTime, sum(amount)) from Order where createdTime >= ?1 and createdTime <= ?2 and status = xxx.OrderStatus.COMPLETED group by createdTime")
List<StatisticsPair> statAmountByDay(LocalDate from, LocalDate to);
0 голосов
/ 23 января 2019

Я знаю, что это не лучший способ сделать это, но пока я не найду лучшего решения, вы можете манипулировать возвращаемым временем в виде строки (используя SUBSTRING )

xxx.StatisticsPair(substring(cast(createdTime as nvarchar(19)), 1, 10), sum(amount))

или попробуйте:

xxx.StatisticsPair(cast(createdTime as date), sum(amount))

...