我最近試圖修改我的Hibernate的Session API來JPA API和我跑了一些問題Hibernate的JPA QueryBuilder.like
這裏是我的老會話代碼
Criteria criteria = session().createCriteria(Book.class);
// SEARCH both name, ispn field in the db
if(search != null && !search.isEmpty()){
Criterion name = Restrictions.ilike("name", search, MatchMode.ANYWHERE); // This use to return a list of similar results..
Criterion ispn = Restrictions.ilike("ispn", search, MatchMode.ANYWHERE);
LogicalExpression orExp = Restrictions.or(name, ispn);
criteria.add(orExp);
}
這是我實現的嘗試CriteriaBuilder
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Book> criteria = builder.createQuery(Book.class);
Root<Book> root = criteria.from(Book.class);
criteria.select(root);
if(search != null && !search.isEmpty()){
System.out.println(search);
Predicate predicateName = builder.like(root.get(Book_.name), search); // root.get(Book_.name) must match exactly `search` for it to return anything.
// Predicate predicateIspn = builder.like(root.get(Book_.ispn), search);
criteria.where(predicateName);
}
List<Book> books = entityManager.createQuery(criteria).getResultList();
return books;
問題
Predicate predicateName = builder.like(root.get(Book_.name), search);
CirteriaBuilder.like似乎並沒有工作我必須確保search
完美匹配root.get(Book_.name)
爲它返回結果。
我已經看過休眠文件好像CriteriaBuilder.like只需要2個參數是一個從數據庫映射root.get(Book_.name)
比較輸入search
沒有選擇,我可以告訴它MatchMode.ANYWHERE拍攝。有什麼建議麼?或者我可能使用錯誤的方法?
LogicalExpression orExp = Restrictions.or(name, ispn);
它用於檢查輸入是否匹配name
或ispn
。但是使用JPA CriteriaBuilder,我會如何做到這一點?我環顧四周,一些教程就是找不到,有一個完整的CRUD實例教程...
謝謝
謝謝你這麼多的額外的建議! –