Устаревший, этот пост, но я хочу добавить то, что я недавно построил для простых запросов
public static class Jpa2Whatsoever {
private final EntityManager em;
public class Jpa2WhatsoeverProgress<T> {
private CriteriaQuery<T> cq;
private List<Predicate> predicates = new ArrayList<>();
private Root<T> root;
public Jpa2WhatsoeverProgress(Class<T> type) {
this.cq = em.getCriteriaBuilder().createQuery(type);
this.root = cq.from(type);
}
public Jpa2WhatsoeverProgress<T> where(String attributeName, Object value) {
Predicate equal = em.getCriteriaBuilder().equal(root.get(attributeName), value);
predicates.add(equal);
return this;
}
public List<T> getResultList() {
Predicate[] predicatesArray = new Predicate[predicates.size()];
TypedQuery<T> typedQuery = em.createQuery(cq.select(root).where(predicates.toArray(predicatesArray)));
List<T> resultList = typedQuery.getResultList();
return Collections.unmodifiableList(resultList);
}
}
public Jpa2Whatsoever(EntityManager entityManager) {
this.em = entityManager;
}
public <T> Jpa2WhatsoeverProgress<T> select(Class<T> type) {
return new Jpa2WhatsoeverProgress<T>(type);
}
}
Вы можете использовать это так
List<MyEntity> matchingEntities = new Jpa2Whatsoever(entityManager).select(MyEntity.class).where("id", id).where("due", new Date()).getResultList();
В конце концов я остановил это. Главным образом потому, что я увидел, что у меня было только два запроса, и мне пришлось бы расширить DSL, чтобы получить в него требуемые характеристики запроса, такие как
- больше чем, меньше чем
- Метамодель поддержки
QueryBuilder.currentDate()
и тому подобное.
Кроме того, я считаю уродливым всегда вызывать where
, в то время как на самом деле это соответствует более SQLly and
. В любом случае, если кто-то заинтересован в очень простом API запросов, попробовать все же стоит.
Кстати: забудьте об именах, это был прототип, ничего более.