JPA 有一個非常巧妙的按示例查詢的選項,如下所述:按示例查詢。
有沒有辦法使用這個系統在兩次之間匹配一個帶時間戳的物件?
例如:我在資料庫中記錄了銷售額。我想獲取 ID 為 7 的商品在 2021 年 10 月 20 日 07:00 到 13:00 之間的所有銷售額。
在代碼方面,我會在存盤庫界面中創建一個查詢:
@Query("SELECT s FROM Sale s "
"WHERE s.id IS ?1 "
"AND s.timestamp > ?2 "
"AND s.timestamp < ?3"
)
List<Sale> getSalesForIdBetweenTimestamps(
Long ID,
Timestamp after,
Timestamp before
);
...然后從服務中呼叫它,但使用示例匹配我可以這樣呼叫它:
Example<Sale> saleExample = Example.of(new Sale().withID(7));
List<Sale> salesWithID = this.salesRepository.findAll(saleExample);
...看起來更整潔,不需要在存盤庫中寫入。
我知道如何提供與ID的例子中找到該專案的所有銷售,我甚至可以創建一個自定義的匹配使用這個類之前和之后做單時間。我可以通過避免使用整個“示例查詢”系統來使用不同的解決方案,這就是我現在正在做的,但我想使用它并且無法弄清楚如何在兩次之間進行匹配。
uj5u.com熱心網友回復:
由于這個問題,我在規范中找到了一個解決方案。
規范是用許多謂詞構建的,這些謂詞可以手動撰寫,也可以從示例中提取。這意味著創建一個示例使規范更易于撰寫和閱讀,然后您可以調整它以具有示例不提供的功能。
就我而言,創建規范的函式如下所示:
public Specification<Sale> getSpecFromDatesAndExample(
final Optional<Timestamp> after,
final Optional<Timestamp> before,
final Example<Sale> example
) {
return (root, query, builder) -> {
final List<Predicate> predicates = new ArrayList<>();
after.ifPresent(timestamp -> predicates.add(builder.greaterThan(root.get("timestamp"), timestamp)));
before.ifPresent(timestamp -> predicates.add(builder.lessThan(root.get("timestamp"), timestamp)));
predicates.add(QueryByExamplePredicateBuilder.getPredicate(root, builder, example));
return builder.and(predicates.toArray(new Predicate[0]));
};
}
..這又可以像這樣傳遞到存盤庫中:
public List<SaleDTO> getSales(
final Pageable pageable,
final Optional<String> productName,
final Optional<String> after,
final Optional<String> before,
final Optional<Long> customerID,
final Optional<Long> quantity
)
{
Sale example = new Sale();
productName.ifPresent(example::setProductName);
customerID.ifPresent(example::setCustomerID);
quantity.ifPresent(example::setQuantity);
Optional<Timestamp> afterTimestamp = after.map(Timestamp::valueOf);
Optional<Timestamp> beforeTimestamp = before.map(Timestamp::valueOf);
List<SaleDTO> saleList = new ArrayList<>();
return this.saleRepository.findAll(getSpecFromDatesAndExample(afterTimestamp, beforeTimestamp, Example.of(example)), pageable);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/339859.html
