3

SparePartテーブルでは、行の一意性はmaterialNameとmaterialNumberの組み合わせから与えられます。私がやりたいのは、現在利用可能なスペアパーツの総数を取得することです。

count(distinct ...)を使用してみましたが、2つではなく1つのフィールドでしか機能しません。

内部クエリを使用したSQLクエリ(Hibernateクエリ言語を使用)は次のようになります。

select count(*) from (
     select distinct materialName, materialNo from SparePart
) as col
4

3 に答える 3

4

subquery + group byを使用して、特定のグループを表す最初のIDをフィルタリングし、最後にフィルターに一致するすべてのIDをカウントします。

SELECT COUNT(sp2) FROM SparePart sp2 WHERE EXISTS
  (SELECT sp.materialName, sp.materialNo
          FROM SparePart sp
          GROUP BY sp.materialName, sp.materialNo
          HAVING MIN(sp.id)=sp2.id)
于 2012-06-15T12:43:18.313 に答える
1

このタスクには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
于 2015-07-21T08:11:37.837 に答える
0

CriteriaAPIで試すことができます。

ProjectionList projectionList = Projections.projectionList();        
projectionList.add(Projections.property("materialName"));
projectionList.add(Projections.property("materialNo"));

Criteria criteria = session.createCriteria(SparePart.class); 
criteria.setProjection(Projections.distinct(projectionList);  
criteria.setProjection(Projections.rowCount());

Long results = criteria.uniqueResult();

また、私が試したことがないので、クエリに応じてマッピングされているため、いくつかの変更が必要になる場合があります。

于 2012-06-15T13:18:23.270 に答える