@Query(value = "select usd from UserDetail usd where usd.phoneNumber=:phoneNumber")
Optional<UserDetail> findByPhoneNumber(@Valid @Param("phoneNumber") String phoneNumber);
這是我的 JPQL 查詢方法,我在這里使用帶有Optional. 我想知道如何使用CriteriaBuilder?
我是這樣寫的,但出現錯誤。
@Override
public Optional<UserDetail> findByCreatedDate(String phoneNumber) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDetail> cq = cb.createQuery(UserDetail.class);
Root<UserDetail> root = cq.from(UserDetail.class);
cq.where(cb.equal(root.get("phoneNumber"), phoneNumber))
.orderBy(cb.desc(root.get("phoneNumber")));
return em.createQuery(cq).getResultList().get(3);
}
uj5u.com熱心網友回復:
如果方法回傳型別Optional正是您必須回傳的型別。
該行em.createQuery(cq).getResultList().get(3)僅回傳,UserDetail因此您需要將其包裝為Optional.of:
@Override
public Optional<UserDetail> findByCreatedDate(String phoneNumber) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDetail> cq = cb.createQuery(UserDetail.class);
Root<UserDetail> root = cq.from(UserDetail.class);
cq.where(cb.equal(root.get("phoneNumber"), phoneNumber))
.orderBy(cb.desc(root.get("phoneNumber")));
return Optional.of(em.createQuery(cq).getResultList().get(3));
}
順便說一句,你確定硬編碼.get(3)是你想要的嗎?如果串列為空或少于 4 個元素,則會拋出運行時例外。
uj5u.com熱心網友回復:
如果一個電話號碼只與一個人相關聯,為什么要嘗試獲取串列?
看看這個:
@Override
public Optional<UserDetail> findByCreatedDate(String phoneNumber) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<UserDetail> cq = cb.createQuery(UserDetail.class);
Root<UserDetail> root = cq.from(UserDetail.class);
cq.where(cb.equal(root.get("phoneNumber"), phoneNumber)).orderBy(cb.desc(root.get("phoneNumber")));
UserDetail ud = em.createQuery(cq).getSingleResult();
return ud == null ? Optional.empty() : Optional.of(ud)
}
問候,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/324674.html
