我正在設定一種按“lastupdated”列過濾條目的方法。我正在嘗試過濾 lastupdated 值介于給定 startTime 和 endTime 之間的條目。我正在使用下面的簡化代碼:
public List<SomeEntity> getItemsByLastUpdated() {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<SomeEntity> criteriaQuery = cb.createQuery(SomeEntity.class);
var root = criteriaQuery.from(SomeEntity.class);
var predicates = new ArrayList<>();
var startTime = Instant.now();
var endTime = Instant.now().plus(5, MINUTES);
predicates.add(cb.greaterThanOrEqualTo(root.get("lastupdated"), startTime));
predicates.add(cb.lessThan(root.get("lastupdated"), endTime));
criteriaQuery.where(predicates.toArray(new Predicate[0]));
return entityManager.createQuery(criteriaQuery).getResultList();
}
由于某種原因,沒有(正確)應用日期時間欄位的標準:正在回傳所有物體,而不僅僅是 startTime-endTime 范圍內的專案。
我猜我需要明確宣告“lastupdated”欄位是日期時間欄位;當我將 startTime 設定為 Instant.MAX 時,我收到一個似乎暗示日期過濾器而不是日期時間的錯誤:
Invalid value for EpochDay (valid values -365243219162 - 365241780471): 365241780838
有誰知道我如何過濾兩個給定的java Instants之間的日期時間欄位?
PS。我知道使用派生查詢,findByXGreaterThanOrEqualToAndXLessThan(Instant instant1, Instant instant2);但由于我沒有包括其他幾個標準,所以這個選項是不可行的。
uj5u.com熱心網友回復:
我認為您可以使用EntityManagerJPQL 而不是 Criteria API 輕松地做同樣的事情:
public List<SomeEntity> getItemsByLastUpdated() {
var query = "select e from SomeEntity e
where e.lastupdated >= :from
and e.lastupdated < :to
and your_other_criteria";
return entityManager.createQuery(query)
.setParameter("from", startTime)
.setParameter("to", endTime)
.getResultList();
}
uj5u.com熱心網友回復:
我花了很長時間才弄清楚。事實證明,缺少過濾與 CriteriaBuilder 設定沒有任何關系。
我創建了一個測驗來驗證該方法,并在運行測驗之前準備了一些物體。但是,物體類中的“lastupdated”欄位使用 注釋@UpdateTimestamp,這將導致所有保存的物體具有幾乎相同的“lastupdated”值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/432643.html
標籤:春天 PostgreSQL jpa 弹簧数据-jpa
