我有一个查询,我会在较旧的Hibernate中编写(使用SessionFactory
bean)。但是,我已经转移到Spring Boot,现在正在使用JPA 2,它本质上看起来像是Hibernate的一个抽象层。任何人都可以指导我如何添加限制?我相信我现在必须使用EntityManager
bean和JPA。这是旧查询。
@Override
@SuppressWarnings("unchecked")
public List<Party> queryPartiesBetweenDates(Date startDate, Date endDate, String sortBy, Integer count) {
Criteria criteria = getCurrentSession().createCriteria(Party.class);
if (startDate != null) {
criteria.add(Restrictions.ge("startDate", startDate));
}
if (endDate != null) {
criteria.add(Restrictions.lt("endDate", endDate));
}
if (count != null) {
criteria.setMaxResults(count);
}
if (sortBy == null || !sortBy.equals("distance")) {
criteria.addOrder(Order.asc("startDate"));
}
return criteria.list();
}
谢谢!
答案 0 :(得分:1)
CriteriaBuilder比原生的hibernate Restriction API更冗长,主要原因是当你使用MetaModel时它是完全类型的,这意味着如果列的类型或名称导致代码,代码将无法编译查询无效。 这是一个不使用生成的MetaModel类的示例,并且大部分类似于旧的Hibernate代码。
EntityManager em = emf.createEntityManager(); // or injected
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Party> query = cb.createQuery(Party.class);
Root<Party> partyRoot = query.from(Party.class);
query.select(partyRoot);
Predicate predicate = null;
Path<Date> startDatePath = partyRoot.<Date>get("startDate");
if (startDate != null) {
predicate = cb.greaterThanOrEqualTo(startDatePath, startDate);
}
if (endDate != null) {
Predicate additionalPredicate = cb.lessThanOrEqualTo(partyRoot.<Date>get("endDate"), startDate);
if (predicate == null) {
predicate = additionalPredicate;
} else {
predicate = cb.and(predicate, additionalPredicate);
}
}
query.where(predicate);
if (sortBy == null || !sortBy.equals("distance")) {
query.orderBy(cb.asc(startDatePath));
}
return em.createQuery(query).setMaxResults(count).getResultList();
如果您有许多谓词,最好将它们添加到列表中,或者创建一个实用程序方法来处理它们。