0

次の違いは何ですか:

Root<Person> person = cq.from(Person.class);

EntityType<Person> Person_ = em.getMetamodel().entity(Person.class);
Root<Person> person = cq.from(Person_);

私はいくつかのチュートリアルで両方を見てきました..

4

1 に答える 1

2

分析

Hibernate のCriteriaQuery 親の QueryStructure from(..)メソッドを見る:

public <X> Root<X> from(Class<X> entityClass) {
    EntityType<X> entityType = criteriaBuilder.getEntityManagerFactory()
            .getMetamodel()
            .entity( entityClass );
    if ( entityType == null ) {
        throw new IllegalArgumentException( entityClass + " is not an entity" );
    }
    return from( entityType );
}

public <X> Root<X> from(EntityType<X> entityType) {
    RootImpl<X> root = new RootImpl<X>( criteriaBuilder, entityType );
    roots.add( root );
    return root;
}

そのうちの 1 つは単なる過負荷であることがわかります。

結果

より便利で定型的なエスケープ方法は、クラスをパラメーターとして渡すことです。

アドバイス

JPAのCriteriaQueryは単なるインターフェースであり、EclipseLinkやHibernateなどの実装プロバイダーは実際の実装を提供するため、使用しているJPA実装を提供しませんでした。次回はその点を考慮していただければ幸いです。

于 2012-05-24T12:47:58.630 に答える