我正在尝试使用条件api计算对日期字段的不同查询。这就是我所做的;
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> criteriaQuery = criteriaBuilder.createQuery(Long.class);
Root<?> queryRoot = criteriaQuery.from(MyClass.class);
Expression dateExpression = queryRoot.get("myDate");
Expression dayExpression = criteriaBuilder.function("day", Integer.class, dateExpression);
Expression monthExpression = criteriaBuilder.function("month", Integer.class, dateExpression);
Expression dayExpression = criteriaBuilder.function("year", Integer.class, dateExpression);
criteriaQuery.select((Selection) criteriaBuilder.countDistinct(criteriaBuilder.concat(dayExpression, criteriaBuilder.concat(monthExpression, yearExpression))));
entityManager.executeCriteria(criteriaQuery, 0, 1);
我试着连接,因为countDistinct
函数只获取一个表达式。
当我执行此操作时,我得到了;
javax.ejb.EJBTransactionRolledbackException: org.hibernate.hql.internal.ast.QuerySyntaxException: expecting CLOSE, found '(' near line 1, column 31 [select count(distinct function('day', generatedAlias0.manufacturedDate) || function('month', generatedAlias0.manufacturedDate) || function('year', generatedAlias0.manufacturedDate)) from com.myCompany.entity.MyClass as generatedAlias0]
根据我的谷歌搜索,条件查询不支持计数功能和建议使用本机查询。但我需要使用条件api或hibernate来实现它,因为我将它写入我们的框架,并且必须为所有实体正确运行。
我使用Wildfly 10.0附带的PosgreSQL 9.5和Hibernate 5.0.7。
如何使用Hibernate或Criteria Api进行此操作。
非常感谢任何帮助和建议。