问题描述
使用的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 (将#修改为@)