java - 使用涉及日期限制的 JPA2 通过 EntityManger 重写 Hibernate SessionFactory 查询

标签 java hibernate jpa entitymanager

我有一个要在较旧的 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();
}

谢谢!

最佳答案

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();

如果您有许多谓词,将它们添加到列表中或创建一个实用方法来处理它们可能是个好主意。

关于java - 使用涉及日期限制的 JPA2 通过 EntityManger 重写 Hibernate SessionFactory 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675439/

相关文章:

java - 全局 Web 应用程序参数

java - Hibernate:级联问题

java - Criteria api 多重投影

java - Spring Boot JPA hibernate : No identifier specified for entity error even when @Id is present in the entity class

java - 通过ajax(Liferay)在Spring portlet中编码错误

java - 循环遍历一个 int 数组并在其中使用模数

java - 在 Kotlin(和 Gradle)中使用 Hibernate Validator Annotation Processor

java - spring-boot JPA无限循环多对多

java - 如何使用 JPA 在特定实体组中创建对象? (谷歌应用引擎 Java)

java - 如何使用Selma的mapper将pojo与Lombok的注解进行转换