2016-12-26 5 views
0

データベースから最初のN個のエンティティを取得するためのいくつかの一般的なメソッド(Java/Spring/JPA)を作成しようとしました。すべてのエンティティは@アノテーションを持ちますが、idフィールドはさまざまな名前を持つことができます。たとえば、IDがTable.tableIdまたはPlate.plateIdのエンティティです。 tableIdplateIdの両方に@Idアノテーションがありますが、フィールド名は(コードとデータベースで)異なります。フィールド名は変更できません。 JPA Criteria APIでascとsetMaxResultsをソートしようとしましたが、idでソートする方法が見つかりません。JPAのデータベースから最初のN個のエンティティを選択する一般的な方法

import java.util.ArrayList; 
import java.util.List; 

import javax.persistence.EntityManager; 

public class EntityHelper { 

    protected final EntityManager entityManager; 

    public List<ENTITY> getFirstEntities(Class<ENTITY> entityClass, int count) { 
     CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
     CriteriaQuery<ENTITY> criteriaQuery = criteriaBuilder.createQuery(entityClass); 
     Root<ENTITY> root = criteriaQuery.from(entityClass); 
     criteriaQuery.select(root); 
//  HOW TO SORT by ID??? criteriaQuery.orderBy(criteriaBuilder.asc()); 

     TypedQuery<ENTITY> query = entityManager.createQuery(criteriaQuery); 
     return query.setMaxResults(count).getResultList(); 
    } 
} 

私はascでソートする必要がありますか?あるいは、そのような方法を実装する別の方法がありますか? JPA 2.1。

+0

:JPAを使用して、同じことが(私は、ただ読んでJavadocをしようとしなかった)、このようなものを通して実現することができるようです。 [マップされたスーパークラス](http://stackoverflow.com/a/5258090/1199132)を使用して汎用IDフィールドを宣言し、別のID列名を使用する各サブクラスでそれを上書きすることができます。代わりに、あなたはインターフェイスでそれをしようとすることができますが、私はそれが動作するのか分からない。 –

答えて

1

Hibernateを使用して同様の目的で、ClassMetadata.getIdentifierPropertyName()を介してエンティティのidプロパティの名前を取得します。列名は、必ずしも実体フィールド名と一致する必要はありません

IdentifiableType identifiableType = (IdentifiableType) entityManager.getMetamodel().managedType(entityClass); 
String idPropertyName = identifiableType.getId(entityClass).getName(); 
criteriaQuery.orderBy(criteriaBuilder.asc(root.get(idPropertyName))); 
+0

ありがとう、それは動作します! –

関連する問題