您可以使用休眠方言来完成此任务。为此,请创建自己的方言,扩展 DB 使用的方言(所有方言列表),然后注册新功能。例如,我使用带有 InnoDB 引擎的 MySQL 5:
public final class MyDialect extends MySQL5InnoDBDialect {
public MyDialect() {
super();
registerFunction("pairCountDistinct", new SQLFunctionTemplate(LongType.INSTANCE, "count(distinct ?1, ?2)"));
}
}
然后在persistence.xml中添加新属性:
<property name="hibernate.dialect" value="com.example.dialect.MyDialect" />
现在您可以使用此功能:
// some init actions
final CriteriaBuilder builder = entityManager.getCriteriaBuilder();
final CriteriaQuery<Long> criteria = builder.createQuery(Long.class);
final Root<SparePart> root = criteria.from(SparePart.class);
criteria.select(builder.function("pairCountDistinct", Long.class, root.get(SparePart_.materialName), root.get(SparePart_.materialNo)));
final long result = entityManager.createQuery(criteria).getSingleResult();
// some close actions