【问题标题】:Select count with "where" using CriteriaBuilder使用 CriteriaBuilder 选择带有“位置”的计数
【发布时间】:2015-05-08 13:24:31
【问题描述】:

我正在尝试制作这样的东西

SELECT COUNT(*) FROM Tickets WHERE ticketStatus = 3 AND ...

但只能使用 JPA 提供的 CriteriaBuilder。这是我得到的:

private class Criteria {
    CriteriaBuilder builder;
    CriteriaQuery<TicketModel> query;
    Root<TicketModel> root;

    public Criteria() {
        builder = em.getCriteriaBuilder();
        query = builder.createQuery(TicketModel.class);
        root = query.from(TicketModel.class);
    }
}
public long getSearchResultsQuantity(SearchModel search) {
    Criteria c = new Criteria();
    List<Predicate> params = new ArrayList<Predicate>();

    if (search.getStartDate() != null && search.getEndDate() != null) {
        params.add(c.builder.between(c.root.get(TicketModel_.ticketDate), search.getStartDate(),
                search.getEndDate()));
    }

    if (search.getStatus() != -1) {
        params.add(c.builder.equal(c.root.get(TicketModel_.ticketStatus), search.getStatus()));
    }

    CriteriaQuery<Long> q = c.builder.createQuery(Long.class);

    return em.createQuery(
            q.select(c.builder.count(q.from(TicketModel.class))).where(params.toArray(new Predicate[] {})))
            .getSingleResult();
}

但是,当我尝试执行此查询时,我收到了这样的异常:

org.hibernate.hql.internal.ast.QuerySyntaxException: Invalid path: 'generatedAlias1.ticketStatus' [select count(generatedAlias0) from com.mif.spring.models.TicketModel as generatedAlias0 where generatedAlias1.ticketStatus=0]

我在 Spring 有点小白,所以任何帮助都将不胜感激!

【问题讨论】:

  • TicketModel_ 的参数来自哪里?不应该是TicketModel
  • 由于问题与Spring无关,所以我删除了标签。

标签: hibernate jpa orm


【解决方案1】:

问题是你混合了根。

如果您为两个根创建相同的别名将起作用。

例如:

private class Criteria {
    CriteriaBuilder builder;
    CriteriaQuery<TicketModel> query;
    Root<TicketModel> root;


    public Criteria(String alias) {
        builder = em.getCriteriaBuilder();
        query = builder.createQuery(TicketModel.class);
        root = query.from(TicketModel.class);
        root.alias(alias);
    }
}

然后

 Criteria c = new Criteria("someAlias");
 ...
 CriteriaQuery<Long> q = c.builder.createQuery(Long.class);
 Root<TicketModel> root = q.from(TicketModel.class);
 root.alias("someAlias");

 return em.createQuery(
         q.select(c.builder.count(root)).where(
params.toArray(new Predicate[] {})))
                .getSingleResult();

也许您可能对 JpaUtils(我写的)类感兴趣,您可以简单地使用它:

Long count = JpaUtils.count(em, criteria);

用于从任何条件查询中获取计数。

【讨论】:

  • 谢谢!你的解决方案对我有用。我还查看了您的 JpaUtils - 很棒的工作 - 我可能有一天应该使用它!
猜你喜欢
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2013-11-06
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
  • 1970-01-01
相关资源
最近更新 更多