このタスクにはHibernate方言を使用できます。これを行うには、使用したDBの方言(すべての方言のリスト)を拡張する独自の方言を作成してから、新しい関数を登録します。たとえば、MySQL5をInnoDBエンジンで使用しています。
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