Eclipselink CriteriaQuery和NamedQuery的问题

问题描述

使用的Eclipselink版本2.7.3

我有1个表,其中一个是bm_batch_item,它保留了记录的状态。这是我们使用的一个查询

SELECT COUNT(BIE.status) AS total,COUNT(
  CASE LOWER(BIE.status)
    WHEN 'success'
    THEN 1
    ELSE 0
  END) AS succcess,COUNT(
  CASE LOWER(BIE.status)
    WHEN 'submitted'
    THEN 1
    ELSE 0
  END) AS submitted,COUNT(
  CASE LOWER(BIE.status)
    WHEN 'failed'
    THEN 1
    ELSE 0
  END) AS failed,COUNT(
  CASE LOWER(BIE.status)
    WHEN 'cancelled'
    THEN 1
    ELSE 0
  END) AS cancelled
FROM BM_BATCH_ITEM BIE
WHERE BIE.batch_Id    = :batchId

现在假设我只有2行,状态为成功,那么上述查询的输出为2,2,0。

问题 当我将此查询用作本机查询时,它返回正确的结果,但是当我用作命名查询时

SELECT COUNT(BIE.status) AS total,COUNT(
  CASE LOWER(BIE.status)
    WHEN 'cancelled'
    THEN 1
    ELSE 0
  END) AS cancelled
FROM BatchItemEntity BIE
WHERE BIE.batchId    = :batchId

当我使用条件查询时,它会给我2,2和相同的行为。

 final CriteriaBuilder criteriaBuilderForCount = getEntityManager().getCriteriaBuilder();
        final CriteriaQuery batchItemEntityCriteriaQueryForCount = criteriaBuilderForCount.createQuery();
        final Root<BatchItemEntity> batchItemEntityRootForCount = batchItemEntityCriteriaQueryForCount.from(BatchItemEntity.class);
   final Set<Selection<Long>> selectionSet = new HashSet<>();
        final Expression statusExpression = criteriaBuilderForCount.lower(batchItemEntityRootForCount.get(STATUS));
        final Selection<Long> totalCountExpression = criteriaBuilderForCount.count(statusExpression).alias("total");
        selectionSet.add(totalCountExpression);
        final Predicate successPredicate = criteriaBuilderForCount.equal(statusExpression,BatchItemStatus.SUCCESS);
        final Selection<Long> successCountExpression = criteriaBuilderForCount.count(criteriaBuilderForCount.selectCase().when(successPredicate,1).otherwise(0)).alias("success");
        selectionSet.add(successCountExpression);
        final Predicate submittedPredicate = criteriaBuilderForCount.equal(statusExpression,BatchItemStatus.SUBMITTED);
        final Selection<Long> submittedCountExpression = criteriaBuilderForCount.count(criteriaBuilderForCount.selectCase().when(submittedPredicate,1).otherwise(0)).alias("submitted");
        selectionSet.add(submittedCountExpression);
        final Predicate failedPredicate = criteriaBuilderForCount.equal(statusExpression,BatchItemStatus.FAILED);
        final Selection<Long> failedCountExpression = criteriaBuilderForCount.count(criteriaBuilderForCount.selectCase().when(failedPredicate,1).otherwise(0)).alias("failed");
        selectionSet.add(failedCountExpression);
        final Predicate cancelledPredicate = criteriaBuilderForCount.equal(statusExpression,BatchItemStatus.CANCELLED);
        final Selection<Long> cancelledCountExpression = criteriaBuilderForCount.count(criteriaBuilderForCount.selectCase().when(cancelledPredicate,1).otherwise(0)).alias("cancelled");
        selectionSet.add(cancelledCountExpression);
 batchItemEntityCriteriaQueryForCount.multiselect(selectionSet.toArray(new Selection[selectionSet.size()]));
        final List<Predicate> predicateList = new ArrayList<>();
        predicateList.add(criteriaBuilderForCount.equal(batchItemEntityRootForCount.get(BATCH_ID),batchId));
        batchItemEntityCriteriaQueryForCount.where(predicateList.toArray(new Predicate[predicateList.size()]));

        final TypedQuery batchItemEntityTypedQuery = getEntityManager().createQuery(batchItemEntityCriteriaQueryForCount);
batchItemEntityTypedQuery.getSingleResult();

给我2、2、2、2、2。 eclipselink JPA有什么我做错的问题吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...