2016-12-26 8 views
0

Я попытался написать некоторый общий метод (Java/Spring/JPA), чтобы получить первые N сущностей из базы данных. Все объекты имеют @Id аннотацию, но поле id может иметь разные имена. Например, объекты с идентификаторами Table.tableId или Plate.plateId. Оба tableId и plateId имеют аннотацию @Id, но имена полей различаются (в коде и в базе данных). Я не могу изменить имена полей. Я попытался сортировать asc и setMaxResults через API-интерфейс JPA, но я не могу найти способ сортировки по id.Общий метод выбора первых N объектов из базы данных в JPA

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 по id? Или, может быть, есть ли другой способ реализовать такой метод? JPA 2.1.

+0

Названия столбцов не должны совпадать с именами объект поля обязательно. Вы можете использовать [сопоставленный суперкласс] (http://stackoverflow.com/a/5258090/1199132), чтобы объявить общее поле id и затем переопределить его в каждом из подклассов, в которых используется другое имя столбца идентификатора. Кроме того, вы можете попробовать сделать это с помощью интерфейса, но я не уверен, что он сработает. –

ответ

1

Для аналогичной цели, использующей Hibernate, я получаю имя свойства id объекта через ClassMetadata.getIdentifierPropertyName(). Использование JPA, кажется, что то же самое может быть достигнуто через что-то вроде этого (я не пробовал, просто читать Javadoc):

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

Спасибо, это работает! –